每日3天分钟,快速学算法
算法体能训练计划 - 第一周
题目地址 - 206. 反转链表
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
注意: 我们一般在做操作链表的题目时只修改指针不修改值
思路一: 通过迭代修改每个节点的next指针 (遍历链表,将当前节点next指针指向上次一节点)
const reverseList = head => {
let cur = head
let pre = null
while (cur) {
let temp = cur.next // 因为下面要改变当前next指针,存储next指针以便下一次遍历
cur.next = pre
pre = cur // 指向上次节点, 便于下次遍历使用
cur = temp // 遍历下一个节点
}
return pre // 反转后最后一个节点既是头节点
}
- 空间复杂度:O(1)
- 时间复杂度: O(n), n为链表长度
思路二: 通过递归往上的过程修改当前节点的下个节点的next指针指向自己
function reverseList(head) {
// 递归终止条件
// 因为我们需要将当前节点的下个节点的next指针指向自己所以要保证head.next指针的存在
if (!head || !head.next) {
return head // 返回往下最后一个节点,最后一个节点既是反转后的第一个节点
}
const result = reverseList(head.next)
head.next.next = head
head.next = null
return result
}
- 空间复杂度:O(n), n层递归调用空间
- 时间复杂度: O(n), n为链表长度