加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

单链表倒置思想

发布时间:2020-12-13 20:00:36 所属栏目:百科 来源:网络整理
导读:对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。 实现代码: [cpp] view plain copy print ? typedef int DataType; //

对于单链表的逆置有两种方法可以实现:

(1)利用辅助指针

基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。

实现代码:

[cpp] view plain copy print ?
  1. typedefintDataType;//类型定义
  2. typedefstructnode{//单链表定义
  3. DataTypedata;
  4. structnode*next;
  5. }LinkedNode,*LinkList;
  6. voidReverseList(LinkList&ListHead)
  7. {
  8. cout<<"BegintoReversetheList"<<endl;
  9. if((NULL==ListHead)||(NULL==ListHead->next))return;//边界检测
  10. LinkedNode*pPre=ListHead;//先前指针
  11. LinkedNode*pCur=pPre->next;//当前指针
  12. LinkedNode*pNext=NULL;//后继指针
  13. while(pCur!=NULL)
  14. {
  15. pNext=pCur->next;
  16. pCur->next=pPre;
  17. pPre=pCur;
  18. pCur=pNext;
  19. }
  20. ListHead->next=NULL;
  21. ListHead=pPre;//记录下新的头结点
  22. }

示意图:

(2)递归

基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。

实现代码:

写了两个版本

I、返回值为空

[cpp] view plain copy print ?
  1. voidReverseList(LinkedNode*pCur,LinkList&ListHead)
  2. {
  3. if((NULL==pCur)||(NULL==pCur->next))
  4. {
  5. ListHead=pCur;
  6. }
  7. else
  8. {
  9. LinkedNode*pNext=pCur->next;
  10. ReverseList(pNext,ListHead);//递归逆置后继结点
  11. pNext->next=pCur;//将后继结点指向当前结点。
  12. pCur->next=NULL;
  13. }
  14. }


II、返回值为结点类型

[cpp] view plain copy print ?
  1. LinkedNode*ReverseList(LinkedNode*pCur,LinkList&ListHead)
  2. {
  3. cout<<"BegintoReversetheList"<<endl;
  4. if((NULL==pCur)||(NULL==pCur->next))
  5. {
  6. ListHead=pCur;
  7. returnpCur;
  8. }
  9. else
  10. {
  11. LinkedNode*pTemp=ReverseList(pCur->next,ListHead);//递归逆置后继结点
  12. pTemp->next=pCur;//将后继结点指向当前结点
  13. pCur->next=NULL;
  14. returnpCur;
  15. }
  16. }



示意图:

下面给出完整的程序:

[cpp] view plain copy print ?
  1. #include<iostream>
  2. usingnamespacestd;
  3. constintN=6;
  4. typedefintDataType;//类型定义
  5. typedefstructnode{//单链表
  6. DataTypedata;
  7. structnode*next;
  8. }LinkedNode,*LinkList;
  9. /****由数组创建单链表****/
  10. LinkListCreateList(DataTypea[N])
  11. {
  12. LinkedNode*ListHead=newLinkedNode();
  13. ListHead->data=a[0];
  14. ListHead->next=NULL;
  15. for(inti=N-1;i>=1;i--)
  16. {
  17. LinkedNode*p=newLinkedNode();
  18. p->data=a[i];
  19. p->next=ListHead->next;
  20. ListHead->next=p;
  21. }
  22. returnListHead;
  23. }
  24. /****输出单链表****/
  25. voidPrintList(LinkListListHead)
  26. {
  27. if(NULL==ListHead)cout<<"TheListisempty!"<<endl;
  28. else
  29. {
  30. LinkedNode*p=ListHead;
  31. while(p!=NULL)
  32. {
  33. cout<<p->data<<"";
  34. p=p->next;
  35. }
  36. cout<<endl;
  37. }
  38. }
  39. voidReverseList(LinkedNode*pCur,LinkList&ListHead)
  40. {
  41. if((NULL==pCur)||(NULL==pCur->next))
  42. {
  43. ListHead=pCur;
  44. }
  45. else
  46. {
  47. LinkedNode*pNext=pCur->next;
  48. ReverseList(pNext,ListHead);//递归逆置后继结点
  49. pNext->next=pCur;//将后继结点指向当前结点。
  50. pCur->next=NULL;
  51. }
  52. }
  53. intmain()
  54. {
  55. inta[N]={1,2,3,4,5,6};
  56. LinkedNode*list=CreateList(a);
  57. PrintList(list);
  58. LinkedNode*pTemp=list;
  59. ReverseList(pTemp,list);
  60. PrintList(list);
  61. return0;
  62. }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读