反转链表
前言
看的灵神视频,整理了一下反转链表(力扣 206)与部分反转(力扣 92)。
正常反转(即整个链表都反转)
Leetcode 206. 反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
思路
- 定义当前遍历到的节点
cur
- 定义当前节点的上一个节点
pre
,也就是cur
的上一个节点(反转后就是它的下一个节点),初始时为空,因为头节点的下一个节点应该是空的(换句话说,头节点变成了尾节点) - 遍历给定链表,在每次遍历中,执行以下操作
- 定义一个临时变量
next
,记录当前节点cur
的下一个节点。 - 使当前节点
cur
的下一个节点指向pre
(反转) - 使
pre
指向当前节点。 - 当前节点
cur
指向next
(也就是这个节点本来指向的下一个节点)
- 定义一个临时变量
- 遍历结束后,
pre
指向最后一个节点(也就是现在的头节点),cur
指向空。 - 返回
pre
即为答案
代码实现
1 | func reverseList(head *ListNode) *ListNode { |
部分反转
Leetcode 92. 反转链表 Ⅱ
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
思路
大体思路与反转链表同。
- 定义哨兵节点 dummy,dummy 的下一个节点指向 头节点
- 定义节点 p0, p0 等于 dummy
- 操作 p0,使 p0 等于位置 left 的上一个节点。
- cur 指向 p0 的下一个节点(也就是位置 left 的节点)
- 从 left 开始,遍历到 right 的位置。在遍历中:
- 定义一个临时变量
next
,记录当前节点cur
的下一个节点。 - 使当前节点
cur
的下一个节点指向pre
(反转) - 使
pre
指向当前节点。 - 当前节点
cur
指向next
(也就是这个节点本来指向的下一个节点)
- 定义一个临时变量
- p0.Next.Next 指向 cur(也就是反转前 right 位置的下一个节点)
- p0.Next 指向 pre(也就是反转前 right 位置)
- 返回 dummy.Next(头节点)
代码实现
1 | func reverseBetween(head *ListNode, left int, right int) *ListNode { |
其他题目类似。