Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139809
  • 博文数量: 38
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-29 15:19
文章分类

全部博文(38)

文章存档

2013年(23)

2012年(15)

我的朋友

分类: C/C++

2013-07-11 16:47:03

将单链表逆转
第一个版本:(程序如下,复杂但易懂)

点击(此处)折叠或打开

  1. Node * list_reverse(Node *head)
  2. {
  3. Node *cur;
  4. Node *pre;
  5. Node *next;
  6. if(head==NULL) //链表没有节点。
  7. return NULL;
  8. pre=head;
  9. cur=pre->link;
  10. if(cur==NULL) //只有一个节点
  11. return head;
  12. else
  13. next=cur->link;

  14. head->link=NULL; //因为要作为尾节点。

  15. if(next==NULL) //即只有两个节点的特殊情况。
  16. {
  17.     cur->link=pre;
  18.     head=cur;
  19.     return head;
  20. }
  21. while(next!=NULL)
  22.     {
  23.         cur->link=pre;
  24.         pre=cur;
  25.         cur=next;
  26.         next=next->link;
  27.     }
  28.         cur->link=pre;
  29.         head=cur;
  30.         return head;
  31. }*
第二版:(不需要三个指针,更简单,也不用考虑那么几种特殊情况)

点击(此处)折叠或打开

  1. Node * list_reverse(Node *head)
  2. {
  3.   Node * tmp=head;
  4.   Node * next=head;
  5.   if(head==NULL) //链表没有节点。
  6.   return NULL;

  7.   head=NULL; /// 此时head作为链表尾部了。
  8.   //// 一下几步为:先存下当前节点tmp的下一节点用于备份,之后将tmp节点指向新链表的头部并且将新链表的头位置前移,同时控制每次循环都能指向后一个节点向前进行。
  9.   while(tmp->link!=NULL)
  10.   {
  11.      next=tmp->link;
  12.      tmp->link=head;
  13.      head=tmp;
  14.      tmp=next;
  15.   }
  16.   //// 循环退出的时候,tmp指向最后一个节点。
  17.  tmp->link=head;
  18.  head=tmp;
  19. return tmp;
  20. }
测试用例:

点击(此处)折叠或打开

  1. void main()
  2. {
  3. Node *root=list_creat( );
  4. Node * pout=list_reverse(root);
  5. list_show(pout);
  6. list_destroy(pout);
结果:



阅读(1558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~