简述
-
最简单的动态数据结构
-
元素值封装在节点
Node
中,这也给多元素,多类型的存储提供了条件 -
更深入理解引用
-
更深入理解递归
public ListNode removeElements(ListNode head, int val) { if (head == null) return null; head.next = removeElements(head.next, val); return head.val == val ? head.next : head; } public ListNode removeFirstElement(ListNode node, int val) { if (node == null) return null; if (node.val == val) { return node.next; } node.next = removeFirstElement(node.next, val); return node; }
以上截图出自慕课网《数据结构精讲》
优缺点
优点
在头尾增删元素很快(实际应用中很少要从中间插入的),复杂度为O(1)
缺点
不适合用于索引有语义的情况
丧失了随机访问的能力
应用
Java
集合核心类LinkedList
及字典核心类LinkedHashMap
我的实现
扩展实现
相关面试题
-
请说一下链表跟数组的区别?
- 数组静态分配内存,链表动态分配内存;
- 数组在内存中连续,链表不连续;
- 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
- 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1);此处存疑,参考数组和链表增删操作快慢问题
-
ArrayList
和LinkedList
的区别-
ArrayList
是基于动态数组实现的,LinkedList
是基于双向链表实现的。 -
ArrayList
支持随机访问(RandomAccess
),LinkedList
不支持。 -
ArrayList
的查询和尾部插入元素效率较高,中间插入和删除元素效率较低,因为有大量的数组复制操作。LinkedList
的插入和删除效率较高,只需要把节点指针改变一下就行,但是查询效率较低,即使有双向链表的特性可以从两个方向查找,但还是需要使用蛮力法的方式进行遍历,所以效率较低。 -
ArrayList
会造成一定的空间浪费,因为随时需要探测数组容量然后扩容;LinkedList
通过节点方式进行存放数据,不存在空间浪费。
-
-
单向链表和双向链表的区别?
单向链表只能一个方向遍历,双向链表则有前驱,Java中的链表实现就是双向链表,优点是可以使用二分法优化查找,缺点是开辟的空间比单向链表大。