题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]
输入:head = [1], k = 1
输出:[1]
思路
总体思路,通过设置指针,来控制链表,将翻转区的链表单独摘出来,送入递归翻转函数,然后再通过指针链接回原来的链表中
具体思路:
设置如下指针
pre指针:指向翻转区的前一个节点
next指针:指向翻转区的后一个节点
start指针:指向翻转区的头节点
end指针:指向翻转区的尾节点
pre,【start,...,end】,next
翻转区经过翻转后
pre,【end,...,start】,next
本次翻转完成,再移动pre、next、start、end指针到下一个翻转区进行翻转
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
# 设置虚拟节点放在head前
dummy = ListNode()
dummy.next = head
# 设置pre、end指针
# pre指向翻转区的前一个节点,end指向翻转区的尾节点
# 初始时都在dummy处
pre = dummy
end = dummy
while True:
# 移动end到翻转区尾节点
for i in range(k):
# 如果k步之内,end指向整个链表尾节点的next,也就是None了
# 说明最后这个翻转区长度不够,不翻转,跳出for循环
if not end:
break
end = end.next
# 翻转区长度不够,不翻转,结束while循环
if not end:
break
# 正常翻转
# 设置next指针,指向翻转区的下一个节点
next = end.next
# 设置start指针,指向翻转区的头节点
start = pre.next
# pre,【start,...,end】,next
# 将翻转区链表前后断开,剥离出来
pre.next = None # 翻转区和它的前一个节点断开
end.next = None # 翻转区和它的下一个节点断开
# 翻转区链表进入递归函数翻转
# pre,【end,...,start】,next
# 翻转结果的头节点和pre连起来
pre.next = self.reverseList(start)
# 翻转后的尾节点和next连起来
start.next = next
# 移动pre、end指针,到下一个翻转区的前一个节点处
pre = start
end = start
return dummy.next
def reverseList(self,head):
if head == None or head.next == None:
return head
tmp = self.reverseList(head.next)
head.next.next = head
head.next = None
return tmp
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。