Skip to content

Latest commit

 

History

History
79 lines (49 loc) · 2.21 KB

File metadata and controls

79 lines (49 loc) · 2.21 KB

链表的基本操作

要想写出链表的题目, 熟悉链表的各种基本操作和复杂度是必须的。

插入

插入只需要考虑要插入位置前驱节点和后继节点(双向链表的情况下需要更新后继节点)即可,其他节点不受影响,因此在给定指针的情况下插入的操作时间复杂度为O(1)。这里给定指针中的指针指的是插入位置的前驱节点。

伪代码:

temp = 待插入位置的前驱节点.next
待插入位置的前驱节点.next = 待插入指针
待插入指针.next = temp

如果没有给定指针,我们需要先遍历找到节点,因此最坏情况下时间复杂度为 O(N)

提示 1: 考虑头尾指针的情况。

提示 2: 新手推荐先画图,再写代码。等熟练之后,自然就不需要画图了。

删除

只需要将需要删除的节点的前驱指针的 next 指针修正为其下下个节点即可,注意考虑边界条件

伪代码:

待删除位置的前驱节点.next = 待删除位置的前驱节点.next.next

提示 1: 考虑头尾指针的情况。

提示 2: 新手推荐先画图,再写代码。等熟练之后,自然就不需要画图了。

遍历

遍历比较简单,直接上伪代码。

迭代伪代码:

当前指针 =  头指针
while 当前节点不为空 {
   print(当前节点)
   当前指针 = 当前指针.next
}

一个前序遍历的递归的伪代码:

dfs(cur) {
    if 当前节点为空 return
    print(cur.val)
    return dfs(cur.next)
}

例题体会链表用法

注意:快慢指针和链表反转几乎是所有链表类问题的基础,尤其是反转链表,代码很短,建议直接背熟。

206. 反转链表 (简单)

82. 删除排序链表中的重复元素II (中等)

83. 删除排序链表中的重复元素 (简单)

148. 排序链表 (中等)

160. 相交链表 (中等)

141. 环形链表 (简单)

92. 反转链表II (中等)

328. 奇偶链表 (中等)