题目
给你一个链表,每 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