关于数据结构与算法:每日leetcode25-K-个一组翻转链表

35次阅读

共计 1313 个字符,预计需要花费 4 分钟才能阅读完成。

题目

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

正文完
 0