数据结构之链表
我们学习另一种数据结构 —— 链表。
与数组相似,链表也是一种线性数据结构。这里有一个例子:
正如我们所看到的,链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。
链表有两种类型:单链表和双链表。上面给出的例子是一个单链表,这里有一个双链表的例子:
温故而知新,学完这一模块,我们会:
1.了解单链表和双链表的结构;
2.在单链表或双链表中实现遍历、插入和删除;
3.分析在单链表或双链表中的各种操作的复杂度;
4.在链表中使用双指针技巧(快指针慢指针技巧);
5.解决一些经典问题,例如反转链表;
6.分析你设计的算法的复杂度;
7.积累设计和调试的经验。
- 单链表
单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。、
下面是一个单链表的例子:
蓝色箭头显示单个链接列表中的结点是如何组合在一起的。
下面代码是单链表中结点的典型定义:
// Definition for singly-linked list.
public class SinglyListNode {
int val;
SinglyListNode next;
SinglyListNode(int x) { val = x; }
}
与数组不同,我们无法在常量时间内访问单链表中的随机元素。 如果我们想要获得第 i 个元素,我们必须从头结点逐个遍历。 我们按索引来访问元素平均要花费 O(N) 时间,其中 N 是链表的长度。
例如,在上面的示例中,头结点是 23。访问第 3 个结点的唯一方法是使用头结点中的“next”字段到达第 2 个结点(结点 6); 然后使用结点 6 的“next”字段,我们能够访问第 3 个结点。
你可能想知道为什么链表很有用,尽管它在通过索引访问数据时(与数组相比)具有如此糟糕的性能。 在接下来的两篇文章中,我们将介绍插入和删除操作,你将了解到链表的好处。
之后,我们将为你提供练习设计自己的单链表。
如果我们想在给定的结点 prev 之后添加新值,我们应该:
1.使用给定值初始化新结点 cur;
2.将 cur 的“next”字段链接到 prev 的下一个结点 next;
3.将 prev 中的“next”字段链接到 cur 。
与数组不同,我们不需要将所有元素移动到插入元素之后。因此,您可以在 O(1) 时间复杂度中将新结点插入到链表中,这非常高效。
示例
让我们在第二个结点 6 之后插入一个新的值 9。
我们将首先初始化一个值为 9 的新结点。然后将结点 9 链接到结点 15。最后,将结点 6 链接到结点 9。
插入之后,我们的链表将如下所示:
在开头添加结点
众所周知,我们使用头结点来代表整个列表。
因此,在列表开头添加新节点时更新头结点 head 至关重要。
初始化一个新结点 cur;
将新结点链接到我们的原始头结点 head。
将 cur 指定为 head。
例如,让我们在列表的开头添加一个新结点 9。
1.我们初始化一个新结点 9 并将其链接到当前头结点 23。
2.指定结点 9 为新的头结点。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python中类的初始化特殊方法
- Java虚拟机JVM之server模式与client模式的区别
- Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError的解决方法
- Android初学者必须知道的10个技术
- linux 磁盘转移空间的方法
- Android 摄像头高斯模糊的示例代码
- 如何让你的JS代码更好看易读
- JSP页面跳转方法大全
- 将jquery.qqFace.js表情转换成微信的字符码
- 详解ASP.NET中Identity的身份验证代码
- 使用Vue完成一个简单的todolist的方法
- java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令
- Android简单实现一个颜色渐变的ProgressBar的方法
- 23种设计模式(13)java观察者模式
- Vue按需加载的具体实现