[路飞]_leetcode 206. 反转链表 JavaScript版

·  阅读 511
[路飞]_leetcode 206. 反转链表 JavaScript版

「这是我参与11月更文挑战的第 3 天,活动详情查看:2021最后一次更文挑战

题目来源:LeetCode-206. 反转链表

题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

 

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

题解

提出问题

  • 在反转过程中,如何保留链表节点的下一个节点不丢失?

分析 迭代

  • 首先定义三个指针分为precurnext,并对指针进行初始化
  • pre指向 nullcur指向头节点,next指向cur所指向节点的下一个节点

image.png

  • cur指针所指向的节点指向pre所指向的节点

image.png

  • 移动precur所在的位置

image.png

  • 移动curnext所在的位置

image.png

  • 此时第一个节点已经反转完毕,将next指针指向cur所指向节点的下一个节点。

image.png

  • 重复执行上述操作,当cur指针指向null的时候说明,整个链表的反转执行完毕。

image.png

总结 迭代

  • 初始化哨兵节点prenullcur为当前节点head
  • 开始循环,记录 next为当前节点的下一个节点
  • 判断当前节点是否为null
  • 分别交换precurnext使其反转
  • 当cur为null时跳出循环

代码实现 迭代

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(!head) return null
    var pre=null
    var cur = head
    while(cur){
        const next = cur.next;
        cur.next = pre;
        pre = cur
        cur=next
    }
    return pre
};
复制代码

代码优化 迭代

通过使用ES6解构赋值进行代码优化

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(!head) return null
    var pre=null
    var cur = head
    while(cur){
        [cur.next,pre,cur] = [pre,cur,cur.next]
    }
    return pre
};
复制代码

分析 递归

  • 链表初始化状态,由于是递归可以从最后一位反推反转过程

image.png

  • 由于最后一个节点指向下一个节点为空不存在下下个节点所以直接返回当前节点。

image.png

  • 从倒数第二个节点开始分析将当前节点head下一个的下一个节点head.next 指向当前节点head,将当前节点指向null

image.png

重复执行...

image.png

最后整个链表就反转过来了

image.png

总结 递归

  • 首先定义pre指针当前节点的下一个节点反转后的节点
  • 由于后续需要用到head当前节点以及head.next,使用需要判断head当前节点是否为nullhead.next是否存在。
  • 不断递归一次处理,head.next的下一个节点指向当前节点,并断开当前节点与的下一个节点的联系也就是说变为null

代码实现 递归

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(!head || !head.next) return head
    let pre = reverseList(head.next)
    head.next.next = head
    head.next = null
    return pre
};
复制代码
分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改