每日一道Leetcode - 25. K 个一组翻转链表 【链表】

每日一道Leetcode - 25. K 个一组翻转链表 【链表】_第1张图片

# 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: ListNode, k: int) -> ListNode:
        # 如果只有一个节点,或者当前节点为空,直接返回当前的节点
        if head == None  or head.next == None:
            return head
        # 定义一个dummy节点
        dummy = ListNode(0)
        dummy.next = head
        # 定义两个节点pre,end记录当前节点的前驱,以及当前组翻转链表的最后一个节点
        pre = dummy
        end = dummy

        # 只要end没终止,就一直循环
        while end.next!=None:
            # 找k个当前组链表的最后一个节点
            for _ in range(k):
                if end != None:
                    end = end.next
                else:
                    break
            if end == None:
                # 当前组已经不满足k个一组的条件,直接返回,不反转
                break
            # 记录当前组的下一组的开始
            nextNode = end.next
            # 把当前组的尾节点的下一个设置为None,断掉当前链表
            end.next = None
            # 记录当前翻转的头节点
            start = pre.next
            # 调用翻转函数,然后把反转函数返回的节点作为pre的下一个
            pre.next = self.reverse(start)
            # 将当前链表的尾节点【翻转后原来的start头节点就变为尾节点】连到先前断开的链表
            start.next = nextNode
            # 重新定义pre/end为下一组的开始的前一个节点呗,同上面dummy似的,正式链表开始的前驱
            pre = start
            end = start
        return dummy.next

    
    def reverse(self, head):
        # 翻转当前链表
        # 只有一个节点,直接返回
        if head is None or head.next is None:
            return head
        # 前驱节点
        pre = None
        cur = head
        while cur != None:
            nextNode = cur.next
            cur.next = pre
            pre = cur
            cur = nextNode
        return pre

你可能感兴趣的:(Leetcode,链表)