206. 反转链表的两种解法

56 阅读2分钟

方法一,创建新节点

解题思路

1.创建p指针,初始值为null;创建tem,表示临时节点,用于接受新创建的节点
2.遍历头节点
3.每次遍历都创建新节点,赋值tem,相当于复制了一次当前遍历中的节点。然后让tem尾部指向p,接着更新p节点位置,p节点来到tem。
4.head = head.next,让循环继续走下去
5.遍历结束,返回p,即是倒序后的指针

代码,也附上了我leetcode题解,欢迎给我点赞哦

var reverseList = function(head) {
    let p = null
    let tem
    while(head) {
        tem = new ListNode(head.val)
        tem.next = p
        p = tem
        head = head.next
    }

    return p
};

作者:hou-sheng-ren
链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-mei-ci-bian-li-chuan-5i5h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法二,不需要创建新节点

解题思路

1.特殊情况,head为null,直接返回
2.创建p指针,我们将遍历到的节点一次拼到p节点上,并希望最后返回p即可
3.遍历。需要借助临时变量tem,来指向当前遍历中的节点的下一个节点,用于最后更新head,让循环能继续往下走。遍历时,其实就两件大事,一是将当前节点的next指向p,二是更新p的位置。
4.循环结束。发现实际无论链表多长,遍历都会漏掉最后一个节点。需要这样处理:
        head.next = p
        p = head
        return p

代码,也附上了我leetcode题解

var reverseList = function(head) {
    if(!head) return head

    let p = null
    let tem
    while(head.next) {
        tem = head.next // 记录当前节点的下一个节点,以便下一次遍历

        // 1.当前节点指向p
        head.next = p
        // 2.1之后更新p位置
        p = head

        head = tem // 移动到下一节点位置
    }

    // 观察发现,最后一个节点,必定不满足循环条件。所以需要拼接一下head节点
    head.next = p
    return head

};

作者:hou-sheng-ren
链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-bu-xu-yao-chuang-jia-lbhb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。