首页 > 编程知识 正文

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

时间:2023-05-04 10:50:45 阅读:236030 作者:1120

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; if(p->next==NULL){//当遍历到最后一个节点时停止 p->next=q; break; } } return p;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。