c语言链表逆序的问题
2015-05-12 18:48
225 查看
去面试被问到一个问题,怎么把一个链表反转(用原链表),自己在网上找了到了一篇文章,http://blog.csdn.net/sicofield/article/details/8850269,原作者给出了三种方法,
方法一:将链表数据全部读到数组中,然后在倒序输出。
方法二:就是我下面要讲的。
方法三:从第二个结点开始,把之后的每个结点都插入到第一个结点之后,最后在把第一个结点挪到表尾。
第二种方法的思路是:从第二个结点开始,记录它的下个结点,把它挪到第一个结点之前,成为新表头,然后下个结点继续这个过程。
方法三的贴下原作者的代码加上自己的思路:
方法一:将链表数据全部读到数组中,然后在倒序输出。
方法二:就是我下面要讲的。
方法三:从第二个结点开始,把之后的每个结点都插入到第一个结点之后,最后在把第一个结点挪到表尾。
第二种方法的思路是:从第二个结点开始,记录它的下个结点,把它挪到第一个结点之前,成为新表头,然后下个结点继续这个过程。
struct stu *reserve(struct stu *head) { struct stu *p1,*p2,*p3; p1=head; p2=p1->next; // 这个结点为要移动的结点 while(p2) { p3=p2->next; //记录的为要移动的结点的下一个结点 p2->next=p1; //移动结点到最前 p1=p2; //移动的结点变为新表头 p2=p3; //下个结点变为要移动的结点 } head->next=NULL; //移动完毕后head变为表尾,让它指向为空 head=p1; return head; }
方法三的贴下原作者的代码加上自己的思路:
struct stu *reserve(struct stu *head) { struct stu *p,*q; p=head->next; //记录第二个结点 while(p->next!=NULL) { q=p->next; //记录要移动的结点 p->next=q->next; //把该结点从原链表中移除 q->next=head->next; //把该结点连接到head之后 head->next=q; } p->next=head; //把head移动到新表尾,此时链表成环 head=p->next->next; //找到移动完之后的新head p->next->next=NULL; //断开环 return head; }
相关文章推荐
- C语言解字符串逆序和单向链表逆序问题的代码示例
- C语言实现字符串拷贝并逆序的问题
- 单向链表逆序问题
- C语言链表通讯录问题总结
- c语言-报数问题(链表)
- 【数据结构】c语言链表实现报数问题
- C语言链表操作(新增单向链表的逆序建立)
- C语言强化(七)链表相交问题_5 找到两个有环链表的相交结点
- 小白成长日记(14)--(C语言)关于解决头插法单链表中问题二
- C语言强化(七)链表相交问题_5 找到两个有环链表的相交结点
- C语言单向循环链表解决约瑟夫问题
- C语言单链表逆序
- 《C语言实现链表相交、带环问题》
- c语言数据结构之单向循环链表约瑟夫问题
- 用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。
- C语言链表在笔试面试中常考问题总结
- 链表逆序问题
- c语言算法笔试(1)-------链表逆序
- 练练手,练练手——C语言用递归对链表逆序
- C语言链表在笔试面试中常考问题总结