大家先来看看这样一段代码,看能否自己得出输出结果。

#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;}}

席八,迭代创建链表就是个坑货相关推荐

  1. 循环控制-链表反转(与创建链表)

    0.目录 1.循环控制 2.Java代码实现 2.1 创建链表和递归反转实现 2.2 循环反转思路 2.3 链表反转的实现 2.4 测试用例 2.5 循环控制-创建链表 1.循环控制 循环书写方法: ...

  2. linux c语言链表的简单应用之创建链表

    /* ************************************************************************ * Filename: link.c * Des ...

  3. C语言实现前部插入创建链表以及尾部插入链表

    C语言实现由输入的数据来创建链表. 插入部分分为头部插入和尾部插入. 取消掉对应的注释就行. 注意:#define N 10的N一般根据题目要求取最大值+1.保证能够输入所有数. 点击这里,了解更多算 ...

  4. 用JAVA语言创建链表的方法

    链表刚学习时是用c来学习的,那时候对于结构体,指针这些东西实现链表觉得很合适,但想要应用到java上还是有些不同的 这里,我学习下用java来使用链表的方法: 首先,定义节点类 //链表节点 clas ...

  5. 使用malloc创建头结点的坑

    首先,malloc()是动态内存分配函数,用来向系统请求分配内存空间.当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数.因为malloc只管分配内存空间,并不能对分配的 ...

  6. c语言中主函数创建链表,主函数怎么调用函数(数据结构,创建链表)

    主函数怎么调用函数(数据结构,创建链表)0 rnxm44602018.09.29浏览179次分享举报 #include#include"stdlib.h"typedefintEle ...

  7. 每日程序C语言42-带头结点的尾插法创建链表

    题目: 创建单链表(4) 程序分析 带头结点的尾插法创建链表 尾插法顾名思义就是从结点的尾部进行插入,头结点不动,后面的元素依次加入,因为头结点的data中没有存放任何元素,故打印出来是任意存放的值 ...

  8. 每日程序C语言41-带头结点的头插法创建链表

    题目: 创建单链表(3) 程序分析 带头结点的头插法创建链表 带有头结点的链表,头结点中的data中没有放置任何元素,头结点存储的地址就是链表首元素存储的地址.头插法顾名思义就是从链表的头部进行插入, ...

  9. 每日程序C语言40-不带头结点的尾插法创建链表

    题目: 创建一个链表(2) 程序分析 不带头结点的尾插法创建链表 这个是按照顺序插入的,尾插法,顾名思义就是从第一个节点的尾部插入,创建第一个节点之后,在循环中让前面的节点的next指针存储后面节点的 ...

最新文章

  1. R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化随着主成分的增加解释的方差的量(plotting explained variance)
  2. c语言数码管数字时钟程序,数码管显示模拟8位时钟C语言程序设计
  3. 学python最好的方式-自学Python有什么好方法吗?老男孩专业Python培训
  4. idea lombok安装后还是标红_小辣椒神器Lombok
  5. Linux下的top命令
  6. dojo Quick Start/dojo入门手册--package机制
  7. Codeforces Round #486 (Div. 3) C Equal Sums (map+pair)
  8. “对不起,我们只招父母毕业于名牌院校的孩子”:最可怕的,是你还以为学历不重要...
  9. 七、基于比较的排序算法总结
  10. [转载] Python的生成器
  11. C#与NET实战 第5章 进程、线程与同步 节选
  12. 2019胡润女企业家榜公布:碧桂园杨惠妍继续领跑
  13. Java中使用foreach带来的一些问题
  14. 从 XML 到 XPath
  15. Linux Shell 内建命令 : fg , bg , jobs 命令详解
  16. matlab fullbnt,Matlab2010下使用FULLBNT工具箱建立复杂的动态贝叶斯网络
  17. 机场云商sign解析
  18. JAVA简介及视频教程
  19. chrome扩展程序_如何实施Chrome扩展程序
  20. 通过快递鸟如何接入韵达速递电子面单

热门文章

  1. strace工具简介
  2. 卜若的代码笔记-一周速通LayaAir-第三章:给Button添加事件
  3. 四大场景、16款新品,TCL从家庭到园区的撒豆成兵...
  4. 最近工商银行钓鱼网站井喷式增长,过年了小心被钓鱼
  5. 数据库8-数据库查询
  6. 语文七年级计算机作文,七年级下册语文作文.doc
  7. tensor.squeeze函数和tensor.unsqueeze函数的使用
  8. iphone开发图片如何自适应屏幕问题
  9. 数据库获取uuid的方法
  10. 多因子选股之策略的实现