链表
提纲
链表相关的核心点
null 异常处理
dummy node 哑巴节点
快慢指针
插入一个节点到排序链表
从一个链表中移除一个节点
翻转链表
合并两个链表
找到链表的中间节点
基本操作
链表删除
删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现的数字。
思路:链表头结点可能被删除,所以用 dummy node 辅助删除
注意点
A->B->C 删除 B,A.next = C
删除用一个 Dummy Node 节点辅助(允许头节点可变)
访问 X.next 、X.value 一定要保证 X != nil
链表反转
反转链表
反转一个单链表。
思路:用一个 prev 节点保存向前指针,temp 保存向后的临时指针
反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
思路:先遍历到 m 处,翻转,再拼接后续,注意指针处理
链表合并
合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路:通过 dummy node 链表,连接各个元素
合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路:使用分治的方法两个两个地合并链表
快慢指针
链表中点
使用两个指针变量,慢指针每次前进一步,快指针每次前进两步。这样当快指针到达链表末尾时,慢指针恰好在链表的中间位置。要注意链表长度为偶数的情况。
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
重排链表
143. 重排链表 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
回文链表
请判断一个链表是否为回文链表。
结构判断
环形链表
给定一个链表,判断链表中是否有环。
如果链表中存在环,则返回
true。 否则,返回false。
思路:快慢指针,快慢指针相同则有环,证明:如果有环每走一步快慢指针距离会减 1 
环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回
null。
思路:快慢指针,快慢相遇之后,慢指针回到头,快慢指针步调一致一起移动,相遇点即为入环点 
其他
给你一个链表,删除链表的倒数第
n个结点,并且返回链表的头结点。(尝试使用一趟扫描实现)
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
思路:1、hash 表存储指针,2、复制节点跟在原节点后面
总结
链表必须要掌握的一些点,通过下面练习题,基本大部分的链表类的题目都是手到擒来~
null 异常处理
dummy node 哑巴节点
快慢指针
插入一个节点到排序链表
从一个链表中移除一个节点
翻转链表
合并两个链表
找到链表的中间节点
链表的末尾指针最后指向null
最后更新于