Leetcode25. K 个一组翻转链表
这道题很懵,注释也是写给自己看的,免得以后又忘了。如果刚好能帮到你就更好了,由于没时间仔细修改,注释很可能存在不准确的地方,仅供参考,同时欢迎指正!
class Solution:
def reverse(self, head: ListNode, tail: ListNode):
# 定义prev,用于记录改变指针的最后一个节点的位置
prev = None
# p用来记录准备要改变next属性的节点,也是为了保护head节点可以不动
p = head
# prev == tail说明子链表的尾节点已经翻转完毕,即子链表已经翻转完毕,此时的prev已经是尾节点,而p已经到下一个子链表的第一个节点或空节点处了
while prev != tail:
# 记录当前要改变的next,否则改变next后就找不到了
nex = p.next
# 将当前要改变方向的节点的next指向prev,改变节点指向
p.next = prev
# prev移动到当前的节点
prev = p
# 将p移动到下一个要翻转的点
p = nex
# 由于翻转并没有改变head和tail(用prev也可以),所以当前的head已经是尾节点了,而tail是头结点,所以反过来返回
return tail, head
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
# 首先定义原链表头结点dummy
dummy = ListNode(0)
# 建立dummy与链表的关系
dummy.next = head
# 定义子链表的头节点前一个节点指针pre,初始状态指向dummy
pre = dummy
# 当将要翻转的子链表头节点不为空时就一直循环
while head:
# 定义子链表尾节点指针tail,每次循环的初始位置与子链表的头结点指针相同
tail = pre
# 查看是否需要翻转,并将tail移动到子链表的最后一个节点
for i in range(k):
tail = tail.next
# 如果tail为空,那么说明剩余节点数已经不足k个,说明该子链表不需要翻转,直接返回dummy.next结束程序
if not tail:
return dummy.next
# 定义nex用于记录下一个子链表的头节点位置,由于当前子链表的tail随后会发生翻转,不记录,后面子链表就无法与原链表连接
nex = tail.next
# 翻转子链表,并返回新的头节点和尾节点
head, tail = self.reverse(head, tail)
# 将子链表的头与原链表连接
pre.next = head
# 将子链表的尾与原链表连接
tail.next = nex
# 将pre移动到子链表的尾节点,作为下一次翻转的pre
pre = tail
# head也移动到下一次翻转的头节点位置上
head = tail.next
# 返回链表
return dummy.next
代码来自leetcode,加了一些自己理解的注释,方便自己日后复习,也希望能帮助到其他人:
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/
来源:力扣(LeetCode)