c语言链表逆序的问题

去面试被问到一个问题,怎么把一个链表反转(用原链表),自己在网上找了到了一篇文章,http://blog.csdn.net/sicofield/article/details/8850269,原作者给出了三种方法,

方法一:将链表数据全部读到数组中,然后在倒序输出。

方法二:就是我下面要讲的。

方法三:从第二个结点开始,把之后的每个结点都插入到第一个结点之后,最后在把第一个结点挪到表尾。

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

 1 struct stu *reserve(struct stu *head)
 2 {
 3         struct stu *p1,*p2,*p3;        
 4         p1=head;
 5         p2=p1->next;            // 这个结点为要移动的结点
 6         while(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;              
15         return head;
16 }

 

方法三的贴下原作者的代码加上自己的思路:

 1 struct stu *reserve(struct stu *head)
 2 {
 3         struct stu *p,*q;
 4         p=head->next;                           //记录第二个结点   
 5         while(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;                     //断开环
15         return head;
16 
17 }



 

转载于:https://www.cnblogs.com/kingos/p/4498224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值