欢迎光临
我们一直在努力

PTA 链表逆置函数题,函数题

6-1 链表逆置 (16分

本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:

struct ListNode { int data; struct ListNode *next;}; 函数接口定义: struct ListNode *reverse( struct ListNode *head );

其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。

裁判测试程序样例: #include <stdio.h>#include <stdlib.h>struct ListNode { int data; struct ListNode *next;};struct ListNode *createlist(); /*裁判实现,细节不表*/struct ListNode *reverse( struct ListNode *head );void printlist( struct ListNode *head ){ struct ListNode *p = head; while (p) { printf(“%d “, p->data); p = p->next; } printf(“\n”);}int main(){ struct ListNode *head; head = createlist(); head = reverse(head); printlist(head); return 0;}/* 你的代码将被嵌在这里 */ 输入样例: 1 2 3 4 5 6 -1 输出样例: 6 5 4 3 2 1

实现代码如下:

struct ListNode *reverse( struct ListNode *head ){ if(head==NULL)//如果链表为空,直接返回空 return NULL; if(head->next==NULL)//如果链表中只有一个节点,无需逆置 return head; struct ListNode *p=head,*q=NULL,*r=NULL;// while(1){//多个节点的逆置 if(q==NULL){//第一个节点时 q=p; r=p->next; q->next=NULL; } else{//第一个节点后的节点设置 r=p->next; p->next=q; } q=p; p=r; 便宜香港vps if(p->next==NULL){//当遍历到最后一个节点时停止 p->next=q; break; } } return p;}

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。