解题思路
其实更像一个模拟题,但是有两个地方的边界一直没有处理好导致卡了很久。
AC代码
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
def rotate(prev, tail):
# 少了一个end最开始,tail这个节点在循环修改next时候会变,从而导致循环终止条件错误,应该用一个定量记下来
end = tail.next
last = tail.next
curr = prev.next
res = prev.next
while curr != end:
temp = curr.next
curr.next = last
last = curr
curr = temp
prev.next = tail
return res
dummyhead = ListNode(0)
dummyhead.next = head
tail = dummyhead
indexhead = dummyhead
count = 0
while indexhead:
for _ in range(k):
# 这个地方最开始写的是tail,其实应该是判断后面有没有了,后面没有就不能继续计数了
if tail.next:
tail = tail.next
count += 1
else:
break
if count == k:
tail = indexhead = rotate(indexhead, tail)
count = 0
else:
break
return dummyhead.next
官方题解
官方题解单独考虑了一个反转链表,然后把头尾返回,相当于把这个链表插回去
python
class Solution:
# 翻转一个子链表,并且返回新的头与尾
def reverse(self, head: ListNode, tail: ListNode):
prev = tail.next
p = head
while prev != tail:
nex = p.next
p.next = prev
prev = p
p = nex
return tail, head
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
hair = ListNode(0)
hair.next = head
pre = hair
while head:
tail = pre
# 查看剩余部分长度是否大于等于 k
for i in range(k):
tail = tail.next
if not tail:
return hair.next
nex = tail.next
head, tail = self.reverse(head, tail)
# 把子链表重新接回原链表
pre.next = head
tail.next = nex
pre = tail
head = tail.next
return hair.next
作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/248591/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。