1. 程式人生 > >Leetcode 25:k個一組翻轉連結串列(最詳細解決方案!!!)

Leetcode 25:k個一組翻轉連結串列(最詳細解決方案!!!)

給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。

k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。

示例 :

給定這個連結串列:1->2->3->4->5

k = 2 時,應當返回: 2->1->4->3->5

k = 3 時,應當返回: 3->2->1->4->5

說明 :

  • 你的演算法只能使用常數的額外空間。
  • 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

解題思路

關於這個問題,首先我們很容易想到的思路就是通過兩個指標指向一個group

的頭和尾,然後對這個groupreverse操作,如果這兩個指標間的距離小於k,我們不進行操作。另外,我們要確定我們reverse的邊界,我這裡假設邊界為(pre, lat)

pre                 lat
 h -> 1 -> 2 -> 3 -> 4 -> 5
 k = 3

另外,大家也可以想一想,我們的邊界能不能是[pre, lat](pre, lat][pre, lat)這樣的呢?這裡的[pre, lat]實際上就是Leetcode 206:反轉連結串列(最詳細解決方案!!!)文章的內容,和這個問題相比,我們這裡有一個不變數pre

接著,我們來看怎麼進行reverse,首先定義兩個指標lpre=pre.nextcur=lpre.next

pre  lpre cur       lat
 h -> 1 -> 2 -> 3 -> 4 -> 5
 k = 3

cur!=lat的時候我們要做的操作就是lpre.next=cur.nextcur.next=pre.nextpre.next=curcur=lpre.next

pre  lpre      cur  lat
      -----------
      |         |
 h    1 <- 2    3
-> 4 -> 5 | | -----------

我們就可以很容易的寫出這個reverse操作,我們函式_reverseGroup的返回值是lat的前一個node

def _reverseGroup(self, pre, lat):
    lpre = pre.next
    cur = lpre.next
    while cur != lat:
        lpre.next = cur.next
        cur.next = pre.next
        pre.next = cur
        cur = lpre.next

    return lpre

接著我們就要寫整個大迴圈。整個大迴圈結束的條件是cur!=None,然後每k個節點我們做一次reverse,將reverse的結果給pre,接著更新cur=pre.next。如果沒有k個節點的話,我們cur=cur.next即可。

while cur != None:
    if t % k == 0:
        pre = self._reverseGroup(pre, cur.next)
        cur = pre.next
    else:
        cur = cur.next

以下是整個程式碼

class Solution:
    def _reverseGroup(self, pre, lat):
        lpre = pre.next
        cur = lpre.next
        while cur != lat:
            lpre.next = cur.next
            cur.next = pre.next
            pre.next = cur
            cur = lpre.next

        return lpre

    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        h = ListNode(-1)
        h.next = head
        pre = h
        cur = head

        t = 1
        while cur != None:
            if t % k == 0:
                pre = self._reverseGroup(pre, cur.next)
                cur = pre.next
            else:
                cur = cur.next
            t += 1

        return h.next

我們當然可以把這個寫到一個函式中。我們有兩種做法

  • 先遍歷一遍連結串列,統計連結串列長度,然後每k個連結串列做反轉操作。
  • 遍歷連結串列的過程中,每k個連結串列做反轉操作
class Solution:
    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        h = ListNode(-1)
        h.next = head
        pre = h
        cur = head

        while cur != None:
            t = cur
            count = 1
            while count < k and t != None:
                t = t.next
                count += 1
            if count == k and t != None:             
                for _ in range(k - 1):
                    lat = cur.next
                    cur.next = lat.next
                    lat.next = pre.next
                    pre.next = lat 

                pre = cur
                cur = pre.next
            else:
                break

        return h.next

對於第二種

class Solution:
    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        h = ListNode(-1)
        h.next = head
        pre = h
        cur = head

        while cur != None:
            t = cur
            count = 1
            while count < k and t != None:
                t = t.next
                count += 1
            if count == k and t != None:             
                for _ in range(k - 1):
                    lat = cur.next
                    cur.next = lat.next
                    lat.next = pre.next
                    pre.next = lat 

                pre = cur
                cur = pre.next
            else:
                break

        return h.next

我更喜歡第一種寫法。

如有問題,希望大家指出!!!

相關推薦

Leetcode 25:k翻轉連結串列詳細解決方案

給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4-

LeetCode 25. k翻轉連結串列Reverse Nodes in k-Group

題目描述   給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->

LeetCode-25. k翻轉連結串列

題目 給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4->5

Leetcode(25) K翻轉連結串列

題目描述 給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4->5 當 k = 2

LeetCode 25 —— K 翻轉連結串列

1. 題目 2. 解答 首先,利用快慢指標確定連結串列的總結點數。 偶數個結點時,結點個數等於 i * 2。 奇數個結點時,結點個數等於 i * 2 + 1。 然後將連結串列的每

leetcode 25:k翻轉連結串列

建立一個數組,存放k個節點,之後進行改變順序即可 ListNode* reverseKGroup(ListNode* head, int k) { if (k == 1) return head; int i = 0; ListNode*l1 =

LeetCode 25. K 翻轉連結串列 | Python

### 25. K 個一組翻轉連結串列 --- 題目來源:[https://leetcode-cn.com/problems/reverse-nodes-in-k-group](https://leetcode-cn.com/problems/reverse-nodes-in-k-group) ####

Leetcode做題日記:25. k翻轉連結串列(PYTHON)

給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4->5 當 k = 2 時,應當

[leetcode-連結串列]25. k翻轉連結串列

給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4->5

LeetCode25. k翻轉連結串列 結題報告 (C++)

題目描述:給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 :給定這個連結串列:1->2->3->4->5當 k

LeetCode 25. k翻轉鏈表Reverse Nodes in k-Group

lse etc list listnode else 保存 進行 family 示例 題目描述 給出一個鏈表,每 k 個節點一組進行翻轉,並返回翻轉後的鏈表。 k 是一個正整數,它的值小於或等於鏈表的長度。如果節點總數不是 k 的整數倍,那麽將最後剩余節點保持原有順序。

leetcodek翻轉連結串列

題目說明:給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4->5 當 k

25. k翻轉連結串列

給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定

24. 兩兩交換連結串列中的節點/25. k翻轉連結串列

24. 兩兩交換連結串列中的節點 要求: 你的演算法只能使用常數的額外空間。(不能用棧) 分析[1]: 一般在處理連結串列問題時,我們大多時候都會在開頭再加一個dummy node,因為翻轉連結串列時頭結點可能會變化,為了記錄當前最新的頭結點的位置而引入的dummy node ,此外

[LeetCode]k翻轉連結串列Reverse Nodes in k-Group

題目描述 給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->

每日題--LeetCode 25 k翻轉連結串列java

題目描述: 給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4-

LeetCode 25 — Reverse Nodes in k-Group(k翻轉連結串列)

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is le

[LeetCode]25. Reverse Nodes in k-Group k翻轉連結串列

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is less than or equ

[leetcode] 25. k翻轉鏈表

amp nodes group int 第一個 urn n-k 就會 函數表 25. k個一組翻轉鏈表 仍然是鏈表處理問題,略微復雜一點,邊界條件得想清楚,畫畫圖就會比較明確了。 reverse函數表示從 front.next節點開始,一共k個節點做反轉。 即: 1>

Leetcode篇:k翻轉連結串列

@author: ZZQ @software: PyCharm @file: ReverseList.py @time: 2018/11/6 15:13 題目要求:給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k