链表的结构
链表由节点构成,通过指针相互连接,每个节点最多只有一个前驱节点和一个后驱节点,首节点没有前驱节点,尾节点没有后驱节点。
首节点的前面,还会有个名为head的“头节点”,在leetcode题目中,一般该节点的值为-1,而其余正式节点的值为大于0的整数。
链表的分类单向链表,双向链表,回环链表等。
链表的优缺点
链表的优点包括:
- 内存利用率高:相对于数组来说,链表可以动态分配内存,因此能够更好地利用内存。
- 插入和删除操作效率高:相比数组,链表的插入和删除操作不需要移动大量元素,因此效率更高。
- 链表长度可以动态改变:链表的长度可以根据实际需求动态改变,这使得链表在某些场景下非常有用。
链表的缺点包括:
- 随机访问效率低:相比数组,链表无法通过下标进行随机访问,需要从头节点开始遍历整个链表。
- 链表需要额外的空间来存储指针:相对于数组来说,链表需要额外的空间来存储指针信息,因此对于大量数据的存储,链表可能不如数组高效。
- 缓存不友好:由于链表的节点在内存中不一定是连续存储的,因此不容易被缓存,这可能会影响性能。
链表的java实现
用java实现链表的节点
public class Node {
//数据域
public int data;
//指针域,指向下一个节点
public Node next;
public Node() {
}
public Node(int data) {
this.data = data;
}
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
一些需要重点关注的操作
- 插入节点
- 遍历
- 查找
- 清空
- 销毁
- 求长度
- 排序
- 删除节点
- 去重
leetcode上链表的题目解题总结
- 双指针解法:
双指针解法包括快慢指针、左右指针等多种类型。这种解法适用于大多数链表题目,比如寻找相交链表入口,找回环链表判断等,能够通过O(1)的空间复杂度和O(n)的时间复杂度完成操作。
- 递归解法:
递归解法主要应用于链表反转、回文判断等操作。这种解法通常需要O(n)的空间复杂度,但能够实现简单优雅的代码实现。
- 堆栈解法:
堆栈解法主要应用于链表排序、链表合并等操作。这种解法通常需要O(n)的空间复杂度,但能够实现简单易懂的代码实现。
- 哈希表解法:
哈希表解法主要应用于链表去重、链表求交等操作。这种解法通常需要O(n)的空间复杂度,但能够实现高效的代码实现。
- 链表切割解法:
链表切割解法主要应用于链表翻转、链表旋转等操作。这种解法通过将链表分成若干段来完成操作,通常需要O(1)的空间复杂度和O(n)的时间复杂度。