使用迭代與遞歸相結合實現“K 個一組翻轉鏈表”

題目:25. K 個一組翻轉鏈表

給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。
k 是一個正整數,它的值小於或等於鏈表的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

解題思路

見代碼註釋與反轉鏈表之遞歸操作鏈表

代碼

# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    def reverse(self, head, b):
        '''迭代反轉b節點之前的鏈表,操作區間即[head,b),b=None時,反轉整個鏈表,並返回新鏈表的第一個節點'''
        pre = None
        cur = head
        while cur != b:
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        return pre

    def reverseKGroup(self, head, k):
        """
        反轉以head爲第一個節點的鏈表 的前k個節點
        並返回新鏈表的第一個節點
        """
        b = head
        t = k
        while t > 0:
            if b == None: return head  # 如果節點總數不是 k 的整數倍,將最後剩餘的節點保持原有順序。
            b = b.next
            t -= 1

        last = self.reverse(head, b)
        head.next = self.reverseKGroup(b, k)
        return last


# def print_list(head):
#     res = []
#     while head != None:
#         res.append(head.val)
#         head = head.next
#     print(res)
#
#
# s = Solution()
# node1 = ListNode(1)
# node2 = ListNode(2)
# node3 = ListNode(3)
# node4 = ListNode(4)
# node5 = ListNode(5)
# node1.next = node2
# node2.next = node3
# node3.next = node4
# node4.next = node5
# node5.next = None
# print_list(node1)
# print_list(s.reverseKGroup(node1, 3))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章