LC-206. 反转链表

81 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给你单链表的头节点 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

题解

1.递归

递归的方式相对于比较困难,需要解决出现的闭环情况,所以我们需要在返回的前一步进行 head.next = null 的操作。

还有在遇到当前节点为null 或者是 当前节点的next节点的值为null时,返回当前节点。

const reverseList = (head) => {
    if (head == null || head.next == null) {
        return head;
    }
    const newHead = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return newHead;
};

2.迭代 || 双指针

这个算是 双指针 也算是 迭代。

每次循环,判断fast指针的值是否还存在,如果不存在,则结束循环。

  • 每次循环,先保留fast指针的值 给 慢指针 slow,此时的 慢指针slow的值的头,就是当前的值

  • 之后让fast指针向前走。

  • newHead 意思就是新的翻转链表,将翻转链表 newHead ,每次赋值给 慢指针的 slow.next。此时的慢指针slow 就是翻转的值

  • 我们再重新赋值给 newHead

  • 最后返回 newHead ,就是最终翻转后的链表的结果

const reverseList = (head) => {
  let newHead = null
  let fast = head
  let slow = null

  while (fast) {
    slow = fast
    fast = fast.next
    slow.next = newHead
    newHead = slow
  }
  return newHead
}

总结

题目 16 :递归, 迭代 不同方式的解题方法,在链表中的应用。