博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构:单链表就地逆置(递归方法)解析
阅读量:5944 次
发布时间:2019-06-19

本文共 1685 字,大约阅读时间需要 5 分钟。

先上代码:

1 #include 
2 #include
3 using namespace std; 4 5 struct ListNode { 6 int value; 7 ListNode *next; 8 ListNode(int x) :value(x), next(NULL) {} 9 };10 11 //单链表的转置12 // 1)递归方法13 ListNode* reverseByRecursion(ListNode *head)14 {15 if (head == NULL || head->next == NULL)16 return head;17 ListNode *newhead = reverseByRecursion(head->next);18 19 head->next->next = head;20 head->next = NULL;21 return newhead;22 }23 24 int main() {25 ListNode a(3);26 ListNode b(1);27 ListNode c(5);28 ListNode d(6);29 ListNode e(2);30 a.next = &b;31 b.next = &c;32 c.next = &d;33 d.next = &e;34 ListNode *head = &a;35 ListNode* newhead = reverseByRecursion(head);36 while (newhead != NULL) {37 printf("%d\n", newhead->value);38 newhead = newhead->next;39 }40 system("pause");41 }

强烈建议用visual studio,特别是在用到递归的时候,程序什么时候返回,返回到哪里,指针指向的内容会比较难以弄清,但是单步调试就解决了这个问题。

首先定义一个链表:

1 struct ListNode{2   int value;3   ListNode *next;4   ListNode(int x):value(x),next(NULL){}5 };

然后把它们给串联起来形成一个链表:

1  ListNode a(3);2   ListNode b(1);3   ListNode c(5);4   ListNode d(6);5   ListNode e(2);6   a.next = &b;7   b.next = &c;8   c.next = &d;9   d.next = &e;

接着就是进行递归调用,从最后一个节点开始,每每两个节点进行就地逆置,这里要搞明白什么是浅拷贝, 

浅拷贝的意思就是只复制引用(指针),而未复制真正的值。

所以newhead的处理流程是这样的,

2->62->6->52->6->5->12->6->5->1->3

每次两两就地逆置的时候,会关联前面的上下文。

 下面几行的代码不清楚的地方就用单步调试去运行,会有收获的。搞清楚每个节点都相对应的内存空间,我们要做的事只是重新对这些节点进行排序

1     ListNode *newhead = reverseByRecursion(head->next);2 3     head->next->next = head;4     head->next = NULL;5     return newhead;

 以上。

 

转载于:https://www.cnblogs.com/Hwangzhiyoung/p/9190876.html

你可能感兴趣的文章
题解——洛谷 P2680 NOIP提高组 2015 运输计划
查看>>
A1043 Is It a Binary Search Tree (25 分)
查看>>
解决上传文件或图片时选择相同文件无法触发change事件的问题
查看>>
HTTP.sys 远程执行代码验证工具
查看>>
cout设置输出数据不显示科学计数法
查看>>
Windows 10下安装scrapy(pip方式,非wheel)
查看>>
递归犯过的错
查看>>
ModelForm理解简单运用(增删改查)
查看>>
MapReduce1.x与MapReduce2.x差异
查看>>
Spring AOP小记
查看>>
Spark快速入门
查看>>
电力系统【第3章:简单电力系统的潮流分布计算】
查看>>
反射的案例
查看>>
"use strict"严格模式 顾名思义,这种模式使得Javascript在更严格的条件下运行
查看>>
kamctl start
查看>>
【设计模式】装饰者模式
查看>>
EasyUI 之datagrid 使用 【DataGrid属性解释】
查看>>
ssh整合之六管理我们的配置文件
查看>>
C++ const与define
查看>>
不要62
查看>>