席八,迭代创建链表就是个坑货
大家先来看看这样一段代码,看能否自己得出输出结果。
#include <iostream>
using namespace std;
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};
int a[10000];
int n;
void creatLinkedList(ListNode *&cur, int i)
{if (i == n)return ;cur = new ListNode(a[i]);creatLinkedList(cur->next, i+1);
}
int main()
{while (cin >> n){ListNode *head1 = NULL;ListNode *head2 = NULL;ListNode *cur = head1;for (int i = 0; i < n; i ++){cin>>a[i];if (i)cur = new ListNode(a[i]);else {head1 = new ListNode(a[0]);cur = head1; }cur = cur -> next;}cur = head2;creatLinkedList(head2, 0);cur = head1;cout<<"created by iteration:";while (cur != NULL){cout << cur->val<<' ';cur = cur->next; }cout <<endl;cur = head2;cout<<"created by recursion:";while (cur != NULL){cout << cur->val<<' ';cur = cur->next; }cout <<endl;} }
是不是结果应该是一模一样的,那说明你还没有深入理解代码背后的一些操作,不卖关子了,其计算结果应该是这样的:
原因就在于,当使用上述方式的迭代建立链表时,cur每次都会指向NULL,而NULL的存储位置是内存中固定的一个地址,这样当cur=cur->next的时候,就等于cur=NULL,因此cur和其前驱的关系实际上已经断开了,因此原想做成的链已经被拆成一个个单一的节点,而使用递归时,程序控制参数从右向左一一入栈,产生一个参数的副本,当传递cur->next的时候相当于有一个cur->next = new ListNode的过程,因此连接得以保留。
因此如果要使用迭代创建链表的话,应当这么写,即先保护好联系再跳转:
ListNode *head = NULL;ListNode *cur = NULL;for (int i = 0; i < n; i ++){int a;cin >> a;if (!i){cur = new ListNode(a);head = cur;}else{cur->next = new ListNode(a);cur = cur -> next;}}
席八,迭代创建链表就是个坑货相关推荐
- 循环控制-链表反转(与创建链表)
0.目录 1.循环控制 2.Java代码实现 2.1 创建链表和递归反转实现 2.2 循环反转思路 2.3 链表反转的实现 2.4 测试用例 2.5 循环控制-创建链表 1.循环控制 循环书写方法: ...
- linux c语言链表的简单应用之创建链表
/* ************************************************************************ * Filename: link.c * Des ...
- C语言实现前部插入创建链表以及尾部插入链表
C语言实现由输入的数据来创建链表. 插入部分分为头部插入和尾部插入. 取消掉对应的注释就行. 注意:#define N 10的N一般根据题目要求取最大值+1.保证能够输入所有数. 点击这里,了解更多算 ...
- 用JAVA语言创建链表的方法
链表刚学习时是用c来学习的,那时候对于结构体,指针这些东西实现链表觉得很合适,但想要应用到java上还是有些不同的 这里,我学习下用java来使用链表的方法: 首先,定义节点类 //链表节点 clas ...
- 使用malloc创建头结点的坑
首先,malloc()是动态内存分配函数,用来向系统请求分配内存空间.当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数.因为malloc只管分配内存空间,并不能对分配的 ...
- c语言中主函数创建链表,主函数怎么调用函数(数据结构,创建链表)
主函数怎么调用函数(数据结构,创建链表)0 rnxm44602018.09.29浏览179次分享举报 #include#include"stdlib.h"typedefintEle ...
- 每日程序C语言42-带头结点的尾插法创建链表
题目: 创建单链表(4) 程序分析 带头结点的尾插法创建链表 尾插法顾名思义就是从结点的尾部进行插入,头结点不动,后面的元素依次加入,因为头结点的data中没有存放任何元素,故打印出来是任意存放的值 ...
- 每日程序C语言41-带头结点的头插法创建链表
题目: 创建单链表(3) 程序分析 带头结点的头插法创建链表 带有头结点的链表,头结点中的data中没有放置任何元素,头结点存储的地址就是链表首元素存储的地址.头插法顾名思义就是从链表的头部进行插入, ...
- 每日程序C语言40-不带头结点的尾插法创建链表
题目: 创建一个链表(2) 程序分析 不带头结点的尾插法创建链表 这个是按照顺序插入的,尾插法,顾名思义就是从第一个节点的尾部插入,创建第一个节点之后,在循环中让前面的节点的next指针存储后面节点的 ...
最新文章
- R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化随着主成分的增加解释的方差的量(plotting explained variance)
- c语言数码管数字时钟程序,数码管显示模拟8位时钟C语言程序设计
- 学python最好的方式-自学Python有什么好方法吗?老男孩专业Python培训
- idea lombok安装后还是标红_小辣椒神器Lombok
- Linux下的top命令
- dojo Quick Start/dojo入门手册--package机制
- Codeforces Round #486 (Div. 3) C Equal Sums (map+pair)
- “对不起,我们只招父母毕业于名牌院校的孩子”:最可怕的,是你还以为学历不重要...
- 七、基于比较的排序算法总结
- [转载] Python的生成器
- C#与NET实战 第5章 进程、线程与同步 节选
- 2019胡润女企业家榜公布:碧桂园杨惠妍继续领跑
- Java中使用foreach带来的一些问题
- 从 XML 到 XPath
- Linux Shell 内建命令 : fg , bg , jobs 命令详解
- matlab fullbnt,Matlab2010下使用FULLBNT工具箱建立复杂的动态贝叶斯网络
- 机场云商sign解析
- JAVA简介及视频教程
- chrome扩展程序_如何实施Chrome扩展程序
- 通过快递鸟如何接入韵达速递电子面单