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
group
做reverse
操作,如果這兩個指標間的距離小於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.next
和cur=lpre.next
pre lpre cur lat
h -> 1 -> 2 -> 3 -> 4 -> 5
k = 3
當cur!=lat
的時候我們要做的操作就是lpre.next=cur.next
、cur.next=pre.next
、pre.next=cur
、cur=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
【LeetCode】25. 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 的整數倍,那麽將最後剩余節點保持原有順序。
leetcode:k個一組翻轉連結串列
題目說明:給出一個連結串列,每 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