LeedCode 206:反转链表

这篇博客详细介绍了如何使用递归和迭代两种方法来反转单链表。递归解法中,通过递归调用反转head的后继节点,然后调整节点间的连接。迭代解法利用prev、curr和next三个指针,在遍历过程中不断改变节点的指向,最终完成反转。两种方法的时间复杂度均为O(n),但空间复杂度不同,递归解法可能达到O(n),而迭代解法则为O(1)。
摘要由CSDN通过智能技术生成

反转链表

题目描述:

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

链接:

206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com) 

解题思路

思路一:递归

思路:用递归函数不断反转当前节点head的后继节点next

var reverseList = function (head) {
  if (head === null || head.next === null) { // 边界情况
    return head;
  }
  const newHead = reverseList(head.next);
  head.next.next = head;  // 让后面一个节点指向前一个节点
  head.next = null; // 将前一个节点的next置为空
  return newHead;
};

时间复杂度: O(n)  

空间复杂度: O(n)

思路二:迭代

1. 准备prev,curr,next三个指针(next其实是一个临时存储使用的变量);

2. 在遍历的过程中,让当前指针curr.next指向前一个指针prev;

3. 不断让prev,curr,next向后移动,直到curr为null

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function (head) {
  var prev = null,
    curr = head,
    next = null;
  while (curr != null) {
    next = curr.next;
    curr.next = prev;
    prev = curr;
    curr = next;
    // ES6的解构
    // [prev.next, prev, curr] = [prev, curr, curr.next]
  }
  return prev;
};

时间复杂度: O(n)  

空间复杂度: O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值