二、链表遍历框架
很多链表题目都可以归结为链表的遍历,以及在遍历中做反转、插入和删除操作,因此可以使用链表遍历的框架来解题。链表遍历的框架代码如下:
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
// 进行操作,prev 表示前一个结点,curr 表示当前结点
if (prev == null) {
// curr 是头结点时的操作
} else {
// curr 不是头结点时的操作
}
prev = curr;
curr = curr.next;
}
在遍历的过程中,需要一直维护 prev 是 curr 的前一个结点。curr 是循环中的主指针,整个循环的起始和终止条件都是围绕 curr 进行的。prev 指针作为辅助指针,实际上就是记录 curr 的上一个值。在每一轮遍历中,可以根据需要决定是否使用 prev 指针。注意 prev 可能为 null(此时 curr是头结点),在使用前需要先进行判断。
总结:解决单链表问题时,遵循的步骤是:
1). 判断问题是否为链表遍历-修改,套用链表遍历框架
2). 思考单步操作,将代码加入遍历框架
3). 检查指针丢失等细节
有很多更复杂的链表题目都以反转链表为基础。下面列出了 LeetCode 上几道相关的题目:
* LeetCode 203 - Remove Linked List Elements[2] 是一道直白的链表删除题目
* LeetCode 445 - Add Two Numbers II[3] 以反转链表为基础解题
* LeetCode 92 - Reverse Linked List II[4] 反转部分链表