刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习。连复盘得机会都没有,花了一个上午得时间重新整理了下,如下:

单链表

单链表应该是最简单得链式结构了,应用广泛也十分简单,这里需要注意单链表常用得前序插入后序插入,要从根本原理上理解

1. 后序插入

下面分析后续插入得流程:

  step1: 初始化一个Head节点

  step2: 创建第一个Node1,后续插入得意思每次一个新的节点应该是当作原始链表得尾巴节点插入,那么很明显Node1->next = NULL;现仅有Head节点和Node1节点,Node1节点还是尾巴,那么接下来怎么作呢?很明显Head->next = Node1;第一步插入操作完成。由于每次插入均要插入到尾巴去,那么我们必须要知道尾巴得位置才可以,不然你怎么插入,因此在这里我们引入了phead变量,这个变量应该要时刻指向链表得尾巴节点。由于最开始是是指向head得,所以起了这么个变量

  step3:创建第二个节点Node2,同理,Node2->next = 0; phead是指向链表尾巴得节点,phead->next = Node2; 到此完成插入,为了保证下次插入,phead = Node2;

  step4:同理创建添加。

  …………

代码如下:

 void Solution::creatList(ListNode *head)
{
/*
后续插入
*/
ListNode *phead = head;
for(int i=; i<; i++)
{
ListNode *node = new ListNode;
node->val = i;
node->next = NULL;
phead->next = node;
phead = node;
}
}

后续插入得要点:

  1) 每次插入均是在当前列表得尾巴插入,所以”尾巴->next = Node(new)“,一步插入成功

  2) 一次插入成功后,为了保证下次还能插入成功,你要给一个临时指针变量phead在插入成功,将其指向最后一个节点,

  3) 上述两个要点为一次完整一次插入,并且保证了下次插入也可成功

  4) 结合上图,Head之后一次是Node1,Node2,...,即后续插入

2. 前序插入

前序插入得流程:

  Step1: 创建头节点,Head;前序插入得关键在于时刻改变Head->next得指向

  Step2: 创建Node1节点,让Node1->next = Head->next;这样得操作,我们备份了原Head->next得指向,这样也就解放了Head->next,然后令Head->next = Node1;到此就完成了一次插入

  Step3: 创建Node2节点,让Node2->next = Head->next(此时Head->next指向得是Node1);这也就把Node2和Node1链接起来了,然后再让Head->next = Node2; 再次完成插入

  Step4: 可以看到,Head下依次是Node2, Node1,每次插入都在上次节点得前面,即为前序插入

前序插入得要点:

  1. 时刻改变Head->next得指向

代码如下:

 void Solution::creatList(ListNode *head)
{
/*
前序插入
新建个节点指向原head节点的指向,然后让head->next指向新建的node
*/ ListNode * phead = head;
for(int i=; i<; i++)
{
ListNode *node = new ListNode;
node->val = i;
node->next = phead->next;
phead->next = node;
}
}

以上为单链表前插和后插得知识点总结,仅作备份参考。

【C&数据结构】---关于链表结构的前序插入和后序插入的更多相关文章

  1. (原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数

    题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点, ...

  2. 数据结构学习-BST二叉查找树 : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图

    二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ...

  3. 《Java数据结构》链表结构(单向链表,双向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  4. POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)

    1.前序遍历的规则:(根左右) (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 对于图中二叉树,前序遍历结果:ABDECF 2.中序遍历的规则:(左根右) (1)中序遍历左子树 (2)访 ...

  5. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

  6. POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)

    题目链接 问题描述 : We are all familiar with pre-order, in-order and post-order traversals of binary trees. ...

  7. 二叉树:前序遍历、中序遍历、后序遍历,BFS,DFS

    1.定义 一棵二叉树由根结点.左子树和右子树三部分组成,若规定 D.L.R 分别代表遍历根结点.遍历左子树.遍历右子树,则二叉树的遍历方式有 6 种:DLR.DRL.LDR.LRD.RDL.RLD.由 ...

  8. PAT甲题题解-1119. Pre- and Post-order Traversals (30)-(根据前序、后序求中序)

    (先说一句,题目还不错,很值得动手思考并且去实现.) 题意:根据前序遍历和后序遍历建树,输出中序遍历序列,序列可能不唯一,输出其中一个即可. 已知前序遍历和后序遍历序列,是无法确定一棵二叉树的,原因在 ...

  9. [二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)

    1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct po ...

随机推荐

  1. 为什么有的文件从SVN上更新不下来

    前几天使用eclipse的插件从SVN上更新代码,将全部的代码更新下来后启动项目,前台报错说有些js文件找不到,后来检查我的工程里确实没有那些文件,经过检查发现SVN上却有这些文件,那为什么更新不下来 ...

  2. jQuery 选择器 bug

    $(function(){ $(".menu li").hide(); //目标对象(一定要用class或id选择器)绑定函数 $(".menu").click ...

  3. 12627 - Erratic Expansion——[递归]

    Piotr found a magical box in heaven. Its magic power is that if you place any red balloon inside it ...

  4. 2019-3-1-C#-double-好用的扩展

    title author date CreateTime categories C# double 好用的扩展 lindexi 2019-3-1 9:19:5 +0800 2018-05-15 10: ...

  5. Linux 内核控制 urb

    控制 urb 被初始化几乎和 块 urb 相同的方式, 使用对函数 usb_fill_control_urb 的 调用: void usb_fill_control_urb(struct urb *u ...

  6. dotnet 方法名 To 和 As 有什么不同

    在看到 dotnet 框架里面有很多方法里面用了 ToXx 和 AsXx 好像都是从某个类转换为另一个类,那么这两个方法命名有什么不同 在约定的方法命名里面,用 To 的方法表示从类 A 转为类 B ...

  7. jmeter安装配置教程及使用

    背景: 因为双11,黑五快到了,所有的互联网电商行业都要做一件事情,那就是压测,常见的压测很多区分,接口压测和全链路压测.线上压测和线下压测,单元压测和功能压测.我们这里介绍一下接口压测和全链路压测. ...

  8. Python13_安装、解释器

    Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖, 比如centos下的yum就是python2写的 ...

  9. json_encode函数的JOSN_UNESCAPE_UNICODE

    echo  json_encode('测试');  //\u6d4b\u8bd5 echo  json_encode('测试',JSON_UNESCAPED_UNICODE); // 测试 加上JSO ...

  10. 第二阶段:4.商业需求文档MRD:2.PRD-功能详细说明

    功能详细说明 功能一般分两类:1.通用性功能(导航,菜单项) 通过PRD让各个部门清楚的了解产品的各项功能构成.