【路飞 - 算法体能训练】链表 - 之反转链表

188 阅读1分钟

每日3天分钟,快速学算法

算法体能训练计划 - 第一周

9d5cef69ly1fy8mpo6qvtg208w06oq8x.gif

题目地址 - 206. 反转链表

image.png

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

注意: 我们一般在做操作链表的题目时只修改指针不修改值

思路一: 通过迭代修改每个节点的next指针 (遍历链表,将当前节点next指针指向上次一节点)

image.png

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指针指向自己

image.png

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为链表长度