LeetCode JavaScript实现 反转链表(三种思路)

Posted YuLong~W

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode JavaScript实现 反转链表(三种思路)相关的知识,希望对你有一定的参考价值。

206 反转链表(简单)

原题链接:206. 反转链表
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {

};

解题思路:

①双指针迭代法

  • 先存储当前结点的下一个结点
  • 把当前结点取出,指向上一个结点
  • 更换下一个结点继续迭代
var reverseList = function(head) {
   
    if(head==null){
        return null
    }
    var prev=null//前指针结点 可理解为创建了一个空链表
    var curr=head//当前指针结点
    var temp=null//临时结点
    //每次循环把当前结点指向前一个结点 把前结点和当前结点后移
    while(curr!=null){
        temp=curr.next //存当前结点的下一个结点,用于后移
        curr.next=prev  //当前结点指向前一个结点
        prev=curr       //前指针结点后移
        curr=temp       //当前指针结点后移
        //console.log(prev)
    }
    return prev //此时prev就是反转新链表的头结点
};

检测:console.log(prev) 每次循环后 打印prev的结果是

  1. [1]
  2. [2,1]
  3. [3,2,1]
  4. [4,3,2,1]
  5. [5,4,3,2,1]

②迭代法(与上一个思路类似,略复杂)

  • 让p指向第一个结点,通过指向使得p的位置在不断后移
  • q指向p的下一个结点,即每次循环需要放到第一个位置的结点,依次迭代
  • 让list指回q 确保链不断
var reverseList = function(head) {
   if(head==null){
        return null
    }
    var list=head 
    var p=list
    var q=null
    while(p.next!=null){
        q=p.next 
        p.next=q.next //断开当前第一个结点和当前第二个结点的连接,使第一个结点指向第三个结点
        q.next=list //断开当前第二个结点和第三个结点的连接,指向第一个结点
        list=q  //让list和q相连 
        //console.log(list)
    }
    return list
};

检测:console.log(list) 每次循环后 打印 list 的结果是

  1. [2,1,3,4,5]
  2. [3,2,1,4,5]
  3. [4,3,2,1,5]
  4. [5,4,3,2,1]

③递归调用法

  • 终止条件是当前节点或者下一个节点==null
  • 递归函数中每次返回的 cur 其实是最后一个节点
  • 在递归函数内部,改变的是当前节点的指向
var reverseList = function(head) {
   if(head==null||head.next==null){ 
        return head
    }
    var curr=reverseList(head.next) 
    head.next.next=head //head的下一个结点指向head
    head.next=null //防止循环指向 需要断开
    // console.log(curr)
    return curr
};

检测:console.log(curr)每次打印curr的结果是

  1. [5,4]
  2. [5,4,3]
  3. [5,4,3,2]
  4. [5,4,3,2,1]

具体动画详解可参考:动画演示+多种解法 206. 反转链表

以上是关于LeetCode JavaScript实现 反转链表(三种思路)的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 链表 - 反转链表, leetcode 206

[LeetCode]反转链表

剑指offerJZ15——反转链表。leetcode206.反转链表

LeetCode:反转链表

LeetCode 92. 反转链表 II

LeetCode Java刷题笔记—206. 反转链表