c语言链表逆序的问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c语⾔链表逆序的问题
去⾯试被问到⼀个问题,怎么把⼀个链表反转(⽤原链表),⾃⼰在⽹上找了到了⼀篇⽂
章,/sicofield/article/details/8850269,原作者给出了三种⽅法,
⽅法⼀:将链表数据全部读到数组中,然后在倒序输出。

⽅法⼆:就是我下⾯要讲的。

⽅法三:从第⼆个结点开始,把之后的每个结点都插⼊到第⼀个结点之后,最后在把第⼀个结点挪到表尾。

第⼆种⽅法的思路是:从第⼆个结点开始,记录它的下个结点,把它挪到第⼀个结点之前,成为新表头,然后下个结点继续这个过程。

1struct stu *reserve(struct stu *head)
2 {
3struct stu *p1,*p2,*p3;
4 p1=head;
5 p2=p1->next; // 这个结点为要移动的结点
6while(p2)
7 {
8 p3=p2->next; //记录的为要移动的结点的下⼀个结点
9 p2->next=p1; //移动结点到最前
10 p1=p2; //移动的结点变为新表头
11 p2=p3; //下个结点变为要移动的结点
12 }
13 head->next=NULL; //移动完毕后head变为表尾,让它指向为空
14 head=p1;
15return head;
16 }
⽅法三的贴下原作者的代码加上⾃⼰的思路:
1struct stu *reserve(struct stu *head)
2 {
3struct stu *p,*q;
4 p=head->next; //记录第⼆个结点
5while(p->next!=NULL)
6 {
7 q=p->next; //记录要移动的结点
8 p->next=q->next; //把该结点从原链表中移除
9 q->next=head->next; //把该结点连接到head之后
10 head->next=q;
11 }
12 p->next=head; //把head移动到新表尾,此时链表成环
13 head=p->next->next; //找到移动完之后的新head
14 p->next->next=NULL; //断开环
15return head;
16
17 }。

相关文档
最新文档