Leetcode25-k个一组翻转链表
Leetcode25-k个一组翻转链表
题目
题目链接
题目要求还是简单易懂的,一图胜千言,看图说话:
截图来自Leetcode
思路
是leetcode24的扩展,24是两个一组翻转,这里扩展为k个一组.
与leetcode206一脉相承,206是把整个链表从前到后翻转一遍,这道题是分段翻转,逻辑是一样的,只是多了一些控制条件
1.组内翻转,控制k个一组,这里用数字控制循环
2.组间切换,要判断是否已经处理完了k个,要把prev和curr向前移动
复杂度
时间复杂度,从前到后遍历一次即完成操作,因此为
O
(
n
)
O(n)
O(n)
空间复杂度,新建了空节点,其余节点只改变了指向,
O
(
1
)
O(1)
O(1)
代码
三个指针,同时有箭头指向的变化,不画图光靠想象有点费劲,脑子里运行不容易,建议在草稿纸上画一画箭头的变化,体会一下边界情况的切换
class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
if not head or not head.next:
return head
dummy = ListNode(-1)
dummy.next = head
n = 0
while head:
n += 1
head = head.next
# 末尾小于k个的节点不翻转
n = n//k * k
prev = dummy
node = dummy.next
while n > 0:
i = k
# 进行组内翻转,prev和node保持不动,prev是该组节点前的一个节点,不断指向该组的新的首节点,node是该组的第一个节点,组内翻转后变成最后一个节点
while i > 1:
# 两两翻转
tmp = node.next
node.next = tmp.next
tmp.next = prev.next
prev.next = tmp
i -= 1
n -= 1
# 完成组内翻转后,将prev和node向前移动
prev = node
node = node.next
n -= 1
return dummy.next