单链表逆置实现(C++)

悠悠 2022-06-06 01:50 304阅读 0赞

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

(1)利用辅助指针实现

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

实现代码如下:

  1. typedef int DataType; //类型定义
  2. typedef struct node{ //单链表定义
  3. DataType data;
  4. struct node* next;
  5. }LinkedNode,*LinkList;
  6. void ReverseList(LinkList& ListHead)
  7. {
  8. cout<<"Begin to Reverse the List"<<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; //这一步会使新的尾结点的next域置空
  21. ListHead=pPre; //记录下新的头结点
  22. }

写一个完整的测试用例

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct node //节点类型定义
  4. {
  5. int data;
  6. struct node *next;
  7. }Node;
  8. void printlist(Node *head) //打印链表
  9. {
  10. Node *p = head;
  11. while (p->next)
  12. {
  13. printf("%-4d->", p->data);
  14. p = p->next;
  15. }
  16. printf("%-4d\n", p->data);
  17. }
  18. void reverse(Node *&head) //逆置
  19. {
  20. if (head == NULL || head->next == NULL) //空或者只有一个元素不用逆置
  21. return;
  22. Node *pre, *cur, *rear;
  23. pre = head;
  24. cur = head->next;
  25. while (cur)
  26. {
  27. rear = cur->next;
  28. cur->next = pre;
  29. pre = cur;
  30. cur = rear;
  31. }
  32. //以下两步,很重要
  33. head->next = NULL;
  34. head = pre;
  35. }
  36. int main()
  37. {
  38. Node p9{ 9, NULL };
  39. Node p7{ 7, &p9 };
  40. Node p5{ 5, &p7 };
  41. Node p3{ 3, &p5 };
  42. Node p1{ 1, &p3 };
  43. Node *head = &p1;
  44. printf("原表是\n");
  45. printlist(head);
  46. printf("逆置\n");
  47. reverse(head);
  48. printlist(head);
  49. system("pause");
  50. return 0;
  51. }

SouthEast

(2)递归实现

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

实现代码如下:

  1. void ReverseList(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. }

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    1 问题 如何实现单链表中的数据进行逆置。 2 方法 1. 方法一头插法:利用头插法重新建立带节点的新链表,逆置链表初始为空,表中节点从原链表中依此“删除”,在逐个插入

    相关 元素 C语言

    函数fun的功能是将不带头结点的单向链表逆置。 即若原链表中从头至尾结点数据域依次为:2、4、6、8、10 逆置后,从头至尾结点数据域依次为:10、8、6、4、2

    相关

    算法一 首先想到的肯定是创建一个新的空链表,然后把旧的链表中的元素通过指针p从头到尾遍历,每遍历一个,就把该元素从链表中脱离,添加到新的链表的头部,新建空链表的时候可以初

    相关 实现C++)

    对于单链表的逆置有两种方法可以实现 (1)利用辅助指针实现 基本思想:在遍历结点的过程中,设置辅助指针,用于记录先前遍历的结点。这样依次遍历的过程中只需修改其后继结点的ne

    相关 C语言实现

    单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决。 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递