📅  最后修改于: 2023-12-03 15:36:12.130000             🧑  作者: Mango
在面试中或实际工作中,经常会碰到需要反转链表的问题。一般的做法是使用三个指针 pre
、cur
和 next
,其中 cur
是当前节点,pre
是 cur
的前一个节点,next
是 cur
的后一个节点。通过迭代遍历链表,逐个操作节点,最终实现链表的反转。但是,今天我们要介绍的是一种更有趣的方法,仅使用两个指针就能完成链表反转。
假设我们有一个链表如下:
1 -> 2 -> 3 -> 4 -> null
根据上面的方法,我们需要三个指针分别指向前一个、当前和下一个节点。我们从头节点开始遍历链表,每次将当前节点的 next
指向前一个节点,同时将三个指针依次向后移动一个节点,直到当前节点遍历完整个链表,此时前一个指针就是反转后的新头节点。
这种方法虽然简单易懂,但是需要使用三个指针,稍有不慎容易出错。下面我们就介绍一种更为巧妙的方法。
和上一个方法相比,这个方法只需要使用两个指针,分别指向前一个和当前节点。
在遍历过程中,我们每次让当前节点的 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
的下一个节点,然后将当前节点 curr
的 next
指向前一个节点 prev
,然后将两个指针依次向后移动一位。
通过这样的方式,每次我们都将当前节点接到新链表的头部,并将 prev
指针指向当前节点,为下一次循环做好准备。
最后,当 curr
指向 null
时,遍历结束,此时 prev
指针指向新链表的头部,返回即可。
这种方法虽然简单,但是需要理解一些链表操作的基本原理。同时,这种方法还能帮助我们深入理解链表反转的本质,是一种非常有价值的算法技巧。
总之,对于倒排链表而言,应该多掌握几种方法,对于面试和实际工作都有很大的帮助。