题目
707. 设计链表
21. 合并两个有序链表
82. 删除排序链表中的重复元素 II
83. 删除排序链表中的重复元素
86. 分隔链表
92. 反转链表 II
138. 复制带随机指针的链表(解法比较巧妙)
141. 环形链表
142. 环形链表 II(数学方法计算)
143. 重排链表(综合性比较强:找链表中点+反转链表+合并两个有序链表)
148. 排序链表
206. 反转链表(尤其需要注意递归写法,有点难)
234. 回文链表
技巧
1. 设置虚拟头
2. 快慢指针(快指针每次走两步,慢指针每次走一步)
ListNode slow=head;
ListNode fast=head;
- 判断是否有环(快慢指针重合则有环)
while(fast.next!=null && fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow) return true;
}
return false;
- 找链表中点(快指针走到头了,慢指针就是中点)
while(fast.next!=null && fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return slow;
tips
- 与数组不同,我们无法在O(1)时间内访问单链表中的随机元素
- 与数组不同,插入删除操作不需要移动其他元素。