反转链表

186 阅读2分钟

反转链表

  • 反转链表 -- done

  • 反转子链表 -- done

    • 要求:反转链表的某一段
    • 解题思路:将链表分为三部分,第一部分为 left 之前的;第二部分为 left 到 right;第三部分为 right 之后的。
      • 找到第一部分的尾节点,注意可能为空;第二部分的头节点,反转后是头节点。
      • 反转第二部分链表
      • 第二部分链表的头接第一部分的尾节点,尾接第三部分的头节点。注意,如果第一部分链表的尾结点为空,那么第二部分链表的头就是新的头
    • 时间复杂度:O(N),N 是链表长度
    • 空间复杂度:O(1)
  • 24. 两两交换链表中的节点 -- ing

  • 25. K 个一组翻转链表 -- done

    • 第一个 k-sized 子链表的 prev 为空,需要重新设置头节点
    • 最后一个子链表不足 k-sized,可以再次反转。效率问题:链表比较长的情况下,效率高。
  • 1721. 交换链表中的节点 -- ing

  • 2074. 反转偶数长度组的节点 -- ing

  • Reverse alternating K-element Sub-list -- done

    • 每隔 k 个节点翻转一个 k 个节点的链表
  • 61. 旋转链表 -- done

    • 列表中的每个节点向右旋转 k 个节点

  • 知识点速记(心中要有图):

    • 找到链表的第 n 个节点,需循环 n - 1 次。因为第一个节点是头节点,不需要循环。
    • 反转 n 个节点的链表,需循环 n 次。因为需要从头节点开始反转。
    • 找到链表的末尾节点。关键点,末尾节点的 next 指向空。同时可计算链表长度,注意长度从 1 开始。
    • 加个哨兵头节点,可以减少条件特判。