leetcode-题号206.反转链表

方法一

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值