反转链表
题目描述:
给你单链表的头节点 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)