📜  仅使用 2 个指针迭代反转链表(一种有趣的方法)(1)

📅  最后修改于: 2023-12-03 15:36:12.130000             🧑  作者: Mango

仅使用 2 个指针迭代反转链表(一种有趣的方法)

在面试中或实际工作中,经常会碰到需要反转链表的问题。一般的做法是使用三个指针 precurnext,其中 cur 是当前节点,precur 的前一个节点,nextcur 的后一个节点。通过迭代遍历链表,逐个操作节点,最终实现链表的反转。但是,今天我们要介绍的是一种更有趣的方法,仅使用两个指针就能完成链表反转。

链表反转

假设我们有一个链表如下:

1 -> 2 -> 3 -> 4 -> null

根据上面的方法,我们需要三个指针分别指向前一个、当前和下一个节点。我们从头节点开始遍历链表,每次将当前节点的 next 指向前一个节点,同时将三个指针依次向后移动一个节点,直到当前节点遍历完整个链表,此时前一个指针就是反转后的新头节点。

这种方法虽然简单易懂,但是需要使用三个指针,稍有不慎容易出错。下面我们就介绍一种更为巧妙的方法。

仅使用 2 个指针迭代反转链表

和上一个方法相比,这个方法只需要使用两个指针,分别指向前一个和当前节点。

在遍历过程中,我们每次让当前节点的 next 指向前一个节点,然后将前一个节点和当前节点依次向后移动一个节点,直到当前节点为空。

具体实现示例代码如下所示:

public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode nextTemp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

上面的代码中,prev 初始为 null,即作为新链表的尾节点;curr 初始为头节点 head

每次循环中,我们先用一个变量 nextTemp 存储当前节点 curr 的下一个节点,然后将当前节点 currnext 指向前一个节点 prev,然后将两个指针依次向后移动一位。

通过这样的方式,每次我们都将当前节点接到新链表的头部,并将 prev 指针指向当前节点,为下一次循环做好准备。

最后,当 curr 指向 null 时,遍历结束,此时 prev 指针指向新链表的头部,返回即可。

总结

这种方法虽然简单,但是需要理解一些链表操作的基本原理。同时,这种方法还能帮助我们深入理解链表反转的本质,是一种非常有价值的算法技巧。

总之,对于倒排链表而言,应该多掌握几种方法,对于面试和实际工作都有很大的帮助。