每日一更 -- 简单 -- 反转链表(206)

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

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

image.png

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

🙇‍♂️ 碎碎念:好久没有更新了,真的最近有点坚持不下去了 🤣。有点迷茫最近, 可能真的就是菜狗的状态吧,被打击到了就不行了。最近在想这样坚持下去有用吗。口才不行,你就算懂的再多,表达不好那不是都白扯。简历写不好,可能连hr那关都过不去哎。那如果真的躺平了,那就真的什么都没有机会了。 今天重新拿起‘笔’来。刷一些别人所谓的高频面试题。刚好看到这题,那就当复习一下吧。不过我之前使用的是递归的方法写的,今天用的迭代的方式。

🙇‍♂️ 解题思路: 这道题可以使用迭代跟递归两种方法。这次我使用的是迭代法。

一: 先将链表循环一遍把链表中的值都取出来放到一个数组中。

二: 如果链表不为空,则创建一个节点。将数组中的值从后往前取。并将一个指针指向这个节点

三: 遍历这个数组, 直到数组为空。将新建链表newList的next 重新创建一个节点。 newList 指向 newList.next

顺道讲一下递归法的解法:

一: 定义一个变量pre,让这个变量的值等于递归调用函数返回的结果。函数的参数是head.next

二: 然后让 head.next.next = head。 达到翻转的效果。 同时也要切断head.next的指向。

最后返回pre

// 迭代
var reverseList = function(head) {
  let arr = []
  let newList = null
  let point = newList
  while (head) {
    arr.push(head.val)
    head = head.next
  }
  if (arr.length) {
    newList = new ListNode(arr.pop(), null)
    point = newList
  }
  while (arr.length) {
    newList.next = new ListNode(arr.pop(), null)
    newList = newList.next
  }
  return point
};
// 递归
function reverseList(head: ListNode | null): ListNode | null {
  if (!head || !head.next) {
    return head
  }
  let pre = null
  pre = reverseList(head.next)
  head.next.next = head
  head.next = null
  return pre

};