算法实现:倒转单链表

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net

这又是一道比较俗的题目,但是却经常可以见到。今天想到这道题,虽然知道如何解决,但是把代码完全写好,并调试验证,居然也花了20分钟。看来真的需要好好巩固巩固这些基础知识和算法了。

好,下面回到正题。
单链表的节点,只有一个指针指向下一个节点,那么如果要倒转单链表,如何解决呢?
下面的解决方法,即以swap两个变量的思想,对于链表来说,即使用三个临时指针,来交换指针地址,实现一次遍历单链表,即完成单链表倒转的工作。

  1. struct list_node {
  2.     struct list_node *next;
  3.     void *data;
  4. };

  5. /*
  6. 该函数用于倒转单链表
  7. 参数:head为输入的单链表头指针;
  8. 返回值为:倒转后的单链表的头指针;
  9. */
  10. struct list_node *reverse_list(struct list_node *head)
  11. {
  12.     /* 检查是否为指针是否有效 */
  13.     if (!head) {
  14.         return NULL;
  15.     }

     /* 初始化三个临时指针 */
  1.     struct list_node *p1, *p2, *p3;
  2.     p1 = head;
  3.     p2 = p3 = NULL;

     /* 遍历该单链表,并利用三个临时指针,对单链表的节点的next进行交换 */
  1.     while (p1->next) {
  2.         p2 = p1->next;
  3.         p1->next = p3;

  4.         if (!p2->next) {
  5.             p2->next = p1;
  6.             return p2;
  7.         }
  8.         p3 = p2->next;
  9.         p2->next = p1;

  10.         if (!p3->next) {
  11.             p3->next = p2;
  12.             return p3;
  13.         }
  14.         p1 = p3->next;
  15.         p3->next = p2;
  16.     }
  17.     p1->next = p3;
  18.     
  19.     return p1;
  20. }
这个函数的代码我写得一般,感觉好像还可以把代码再优化一下,更简洁一些。我就不做这个工作了,抛砖引玉了,望大家指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值