跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题leetcode25K个一组翻转链表

这个题好啊,要多看哇。
这个题,真的不错。
还得再写写。
上题。
题目:

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

这篇博客里的图,有助于理解。
好了,就这样吧。

猜你喜欢

转载自blog.csdn.net/mianjiong2855/article/details/107317077