方法一
p1指针通过p1=p1.next循环遍历链表,现在希望每次遍历能将下一个节点指向当前节点。前文的p1=p1.next已经可以表示下一个节点了,所以需要一个变量来存储当前节点,要在p1=p1.next之前把当前节点存起来,也就是p2=p1。然后通过p1.next = p2实现下一个节点指向当前节点。这里我们发现p1.next指向p2,跟我们一开始想的“p1指针通过p1=p1.next循环遍历链表”不一样,所以可以先用一个变量tmp把p1.next存起来。
【2021-12-23】补充:这个链接的“双指针”那里把这个方法解释的很明白。https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
下面是官方的解释:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let p1 = head
let p2 = null
let tem = null
while(p1) {
tem = p1.next
p1.next = p2
p2 = p1
p1 = tem
// p1 = p1.next
}
return p2
};
方法二
递归遍历链表,每次遍历将下一个节点指向当前节点,并清除当前的next指针以避免循环引用。最后出口为指针为null或next为null。代码来自官方,并不是很好懂。我们可以从这个答案出栈的角度去回退就容易理解。
var reverseList = function(head) {
if (head == null || head.next == null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。