Java刷LeetCode总结(二)——链表

130 阅读3分钟

链表的结构

链表由节点构成,通过指针相互连接,每个节点最多只有一个前驱节点和一个后驱节点,首节点没有前驱节点,尾节点没有后驱节点。

首节点的前面,还会有个名为head的“头节点”,在leetcode题目中,一般该节点的值为-1,而其余正式节点的值为大于0的整数。

链表的分类单向链表,双向链表,回环链表等。

链表的优缺点

链表的优点包括:

  1. 内存利用率高:相对于数组来说,链表可以动态分配内存,因此能够更好地利用内存。
  2. 插入和删除操作效率高:相比数组,链表的插入和删除操作不需要移动大量元素,因此效率更高。
  3. 链表长度可以动态改变:链表的长度可以根据实际需求动态改变,这使得链表在某些场景下非常有用。

链表的缺点包括:

  1. 随机访问效率低:相比数组,链表无法通过下标进行随机访问,需要从头节点开始遍历整个链表。
  2. 链表需要额外的空间来存储指针:相对于数组来说,链表需要额外的空间来存储指针信息,因此对于大量数据的存储,链表可能不如数组高效。
  3. 缓存不友好:由于链表的节点在内存中不一定是连续存储的,因此不容易被缓存,这可能会影响性能。

链表的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上链表的题目解题总结

  1. 双指针解法:

双指针解法包括快慢指针、左右指针等多种类型。这种解法适用于大多数链表题目,比如寻找相交链表入口,找回环链表判断等,能够通过O(1)的空间复杂度和O(n)的时间复杂度完成操作。

  1. 递归解法:

递归解法主要应用于链表反转、回文判断等操作。这种解法通常需要O(n)的空间复杂度,但能够实现简单优雅的代码实现。

  1. 堆栈解法:

堆栈解法主要应用于链表排序、链表合并等操作。这种解法通常需要O(n)的空间复杂度,但能够实现简单易懂的代码实现。

  1. 哈希表解法:

哈希表解法主要应用于链表去重、链表求交等操作。这种解法通常需要O(n)的空间复杂度,但能够实现高效的代码实现。

  1. 链表切割解法:

链表切割解法主要应用于链表翻转、链表旋转等操作。这种解法通过将链表分成若干段来完成操作,通常需要O(1)的空间复杂度和O(n)的时间复杂度。