iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
自我挑戰組

用java解Leetcode系列 第 25

用java解Leetcode Day25

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20251009/20169501SIND9G8BLn.pnghttps://ithelp.ithome.com.tw/upload/images/20251009/20169501w6vKWb5XdZ.png

  1. Reverse Nodes in k-Group

這是關於反轉鏈結串列中k個節點的演算法問題。它要求將給定的單項鏈結串列,以每k個節點為一組進行反轉。如果最後一組不足k個節點,則保持其原有的順序不變。

這題的目標是分組反轉鏈結串列。核心要求有以下幾點:

  1. 分組反轉:將鏈結串列分成每k個節點一組。
  2. 完整性檢查:只有當一組中有足夠k個節點時,才對這k個節點進行反轉。
  3. 不足k個節點的處理:如果鏈結串列的末端剩下不足k個節點,這些節點不應被反轉,而是保持原來的順序。
  4. 空間複雜度要求:盡可能在O(1)額外空間複雜度內解決(即只使用少量的指針,不能使用遞迴或堆疊來儲存所有的節點)。

為了滿足O(1)額外空間的要求,解題採用迭代法,使用少量幾個指針來完成反轉和連接的操作。
這題的關鍵技巧有以下幾點:

  1. 虛擬頭節點(Dummy Head):使用一個虛擬頭節點dummy指向原鏈結串列的頭部。這樣可以統一處理對新頭部節點的操作,避免邊界條件檢查。

  2. 分組:每次迭代處理k個節點。需要指針來標記每個組的前一個節點、第一個節點、最後一個節點,以及最後一個節點的下一個節點。

  3. 反轉子鏈結串列:使用一個獨立函數或內嵌邏輯來反轉k個節點的子鏈結串列。這是本題的核心。

  4. 重新連接:反轉完成後,必須將反轉後的子鏈結串列正確地連接回主鏈結串列。
    解題步驟:

  5. 首先建立dummy節點,並讓它只向head。再來,使用一個指針prev來追蹤前一個已反轉組的尾部,初始指向dummy。

  6. 從prev.next(即當前組的第一個節點)開始,走k步,找到當前組的第k個節點kth_node。如果在走k步的過程中遇到null,說明剩下的節點不足k個,停止並返回結果。

  7. 當前要反轉的子鏈結串列是從start = prev.next開始,到kth_node結束。之後,需要一個指針next_group_start儲存下一組的起始節點(即kth_node.next)。上面流程確保後,進行標準的鏈結串列反轉操作,但只需要反轉k個節點。

  8. 反轉之後,原來的start節點變成了新的組尾。將新的組尾(start)連接到下一組的開頭(next_group_start)。

  9. 將prev移到當前組的新組尾(即原來的start),為下一輪分組作準備。

  10. 繼續2.,直到整個鏈結串列被遍歷完畢。

  11. 返回dummy.next。

複雜度分析:
時間複雜度:O(n)。每個節點都被遍歷和處理了一次,反轉操作的總時間與節點總數n成正比。
空間複雜度:O(1)。這題只使用了固定的幾個指針(dummy , prev , start , end , current , temp , tail),沒有使用額外的資料結構來儲存節點。這滿足了Follow-up的要求。


上一篇
用java解Leetcode Day24
系列文
用java解Leetcode25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言