当前课程知识点:数据结构(上) > 第三章 列表 > (b)无序列表 > 03B-3 插入与复制
再来考察列表的插入算法
那么这里呢 我们只以insert Before为例
其余的呢 功能以及实现都类似
我们就不耽误时间了
顾名思义 所谓的insert Before
就是在当前的列表中
以某个位置p为基准
在它的前方 也就是作为它的前驱
插入一个新的节点
而且这个节点的数值应该是
我们指定的e
我们可以看到 实际上它是通过
转而由p作为一个节点的对象
所支持的一个叫作
insert as predecessor
这么样一个接口来实现的
而这个接口是怎么实现的呢?
我们可以看到
它会首先生成这么样一个节点
这个节点的数值呢 为e
而这个节点的前驱呢 恰好就是
当前这个节点的前驱
也就是这个位置
而这个新生成出来的节点的后继呢
恰好就是this
就是当前这个节点
所以这样一句 不仅创建了一个
数值为e的节点
而且完成了这个节点
到当前这个列表的正确的连接
当然还有很多工作要做
接下来 做进一步的调整
也就是 既然新的这个节点
已经以当前节点作为后继
那么当前节点也就应该以
新的这个节点
作为前驱
反之 新的这个节点
既然以原来的那个前驱为前驱
那么原来的这个前驱也就应该
以新的这个节点为后继
至此完成了新节点的插入操作
需要注意的是 这样一种操作
只是在局部进行
我们可以看到 只牵涉到局部的这样
两三个节点
与其它的节点没有关系
我们形象地比喻下的话
这就像一个微创手术
这个微创的好处就在于
它的复杂度是常数的
而这一点与向量是迥然不同的
细心的同学可能会
考虑到一些特殊的情况
比如说 如果当前这个节点是首节点
以至于它的前驱根本就不存在
那么这个时候这种操作难道不会出问题吗?
我们说不会出问题
大家应该记得
我们在此前设立过哨兵
就是说 即便当前这个节点是首节点
它的前驱在内部依然是存在的
也就是header
而这个时候的这种操作依然是安全的
有的时候 我们也需要
以某个已有的列表为蓝本
通过复制来创建一个新的列表
我们来看相应的这个算法
可见 这里被复制的节点范围是
从某一个列表的位置p开始
随后地连续n个节点
所以因此 相应的算法也就是
首先我们创建一个空的列表
这个我们在上一节曾经介绍过
只包含内部的头尾哨兵节点
不包含任何实质的节点
接下来 我们不断地将当前这个p处
所指的那个节点的元素取出来
把它作为当前列表的末节点插入其中
每做完这样一个新节点的引入
我们都会将注意力转向
当前这个节点的后继
如此往复
直到这个区间中的所有n个节点
都被复制过来
那么这个insertAsLast
怎么来实现呢?
大家应该回想得起来
我们所有对外可见的最后那个节点
叫作last 也就是末节点
但是我们这里还同样配备了一个哨兵节点
叫作trailer
所以可见 所谓的insertAsLast
其实就是insertBefore什么呢?
trailer
insertBefore我们刚刚介绍过
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验