这个题好啊,要多看哇。
这个题,真的不错。
还得再写写。
上题。
题目:
25. K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
代码:
class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
if not head: return head
pre = head
end = head
for i in range(k-1): # 往后移动k个节点
end = end.next
if not end:
return pre
nexthead = end.next # 下一个k组的头
# nhead = self.reverse(pre, nexthead)
nhead = self.reverse2(pre, nexthead)
pre.next = self.reverseKGroup(nexthead, k)
return nhead
def reverse(self, pre, end): # 使用新的nhead,两个链表进行reverse
nhead = ListNode(None)
cur = pre
while cur != end:
temp = cur.next
cur.next = nhead.next
nhead.next = cur
cur = temp
return nhead.next
def reverse2(self, pre, end): # 单个链表倒着指回reverse
prre = None # 上一个node,初始化即最后一个node,None
cur = pre
while cur != end:
nex = cur.next
cur.next = prre
prre = cur
cur = nex
return prre
这篇博客里的图,有助于理解。
好了,就这样吧。