LeetCode: 206.反转链表|刷题打卡

360 阅读2分钟

一、题目描述

反转一个单链表。
示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

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

二、思路分析

反转两个节点

如果一开始就考虑长链表的反转就很难。
所以我们先来考虑只拥有两个节点的链表如何反转,这是不是就简单多了?
示例:

输入: ...-> n -> n+1 ->...
输出: ...-> n+1 -> n ->...

反转两个节点:
只需要将节点 n+1 的 next 指向 n 即可。

反转多个节点

那么如何反转多个节点呢?
实际上只需要不断的重复上述的 反转两个节点 的操作即可。
示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解题步骤

  1. 使用双指针遍历链表,两个指针一前一后;
  2. 在遍历链表的过程中,不断的反转双指针 示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

// ----- 1
1  2
^  ^
1->2->3->4->5->NULL

// ----- 2
1          2
^          ^
2->1->NULL 3->4->5->NULL

// ----- 3
1             2
^             ^
3->2->1->NULL 4->5->NULL

// ----- 4
1                2
^                ^
4->3->2->1->NULL 5->NULL

// ----- 5
1                   2
^                   ^
5->4->3->2->1->NULL NULL

三、AC 代码

迭代算法

var reverseList = function(head) {
    let p1 = null
    let p2 = head

    while(p2) {
        let temp = p2.next
        p2.next = p1
        p1 = p2
        p2 = temp
    }

    console.log(p1)
    return p1
}

递归算法

var reverseList = function(node, next = null) {
    if(!node) return null

    const nodeNext = node.next
    node.next = next
    
    if(nodeNext) {
        return reverseList(nodeNext, node)
    }

    return node
}

四、总结

这道题其实很简单的,但是如果一开始就考虑长链表的转换的话就会很复杂甚至会懵,所以考虑问题的时候不要把问题想的太复杂,把问题分化成一个又一个的小问题即可分而治之。
主要考点就是链表的遍历和对链表结构的理解。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情