LeetCode算法题206:反转链表

226 阅读2分钟

LeetCode算法题206:反转链表

题目描述

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


示例一:

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

示例二:

输入:head = [1, 3, 4, 6, 9]
输出:[9, 6, 4, 3, 1]

示例三:

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

解题方法(一):双指针迭代法

思路
  • 首先定义两个指针curr和prev,其中curr指的是当前节点,初始值为head,prev指的是它的上一个节点,初始值为null。一次走一步,直到curr走到链表的尾部, 用next将当前节点的下一个节点保存下来
  • 每走一步就让curr的next指向prev,这样就完成了一次反转
  • 将当前节点下一个节点赋值给当前节点,将更新后的当前节点赋值给它的上一个节点prev,即prev指向curr,curr指向curr的下一个节点
代码
function reverseList(head) {
  let curr = head;       //当前节点curr
  let prev = null;       //当前节点的前一个节点prev
  while(curr) {
    //这里将当前节点的下一个节点保存到next
    const next = curr.next;
    curr.next = prev;
    //迭代更新prev节点
    prev = curr;
    //迭代更新curr节点
    curr = prev;
  }
  return prev;
}
复杂度分析

时间复杂度O(n), 空间复杂度O(1)


解题方法(二):递归法

思路
  • 递归到链表的最后一个节点
  • 将当前节点的下一个节点的next指针指向当前节点,由于反转后不应该指向右边,所以需要断开,让当前节点的next指针指向null
  • 返回当前节点,直到递归结束
代码
var reverseList = function(head) {
  //首先判断如果head==null说明第一次传入的节点为null,直接返回
  //判断head.next==null说明已经递归到链表尾部,返回尾部元素
  if(head==null || head.next==null) {
    return head;
  }
  const newHead = reverseList(head.next);
  head.next.next = head;
  head.next = null
  return newHead;
}
复杂度分析

时间复杂度和空间复杂的都是O(n)



最后

如果有帮助到你,请给这篇文章点个赞和收藏吧,让更多的人看到 ~ ("▔□▔)/

如果有异议的地方,欢迎在评论区留言,我都会逐一回复 ~

如果感兴趣的话,欢迎访问 眼里要有光的博客