二、链表遍历框架

    很多链表题目都可以归结为链表的遍历,以及在遍历中做反转、插入和删除操作,因此可以使用链表遍历的框架来解题。链表遍历的框架代码如下:

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] 反转部分链表

你可能感兴趣的:(二、链表遍历框架)