iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0
Software Development

用leetcode系統化學習C語言系列 第 29

指標進階 2— 雙向鏈結串列

  • 分享至 

  • xImage
  •  

此篇練習「雙向鏈結串列」經典挑戰題,能把前面學到的 prev、next 指標概念整合起來
題目設定有點像「巢狀結構」,每個節點除了有前後指標外,還可能有一個 child 指向另一條子串列
要做的就是把整個多層串列「攤平(flatten)」成一條單層串列。

💬 LeetCode 430.Flatten a Multilevel Doubly Linked List 題目說明
每個節點有三個指標
next:指向下一個節點、prev:指向前一個節點、child:指向子串列(可為 NULL)
請把整條串列攤平成單層雙向鏈結串列。

💡 程式邏輯概述
一、主函式 flatten(Node* head)
若 head 為空,直接回傳
呼叫輔助函式 flattenDFS,從頭節點開始展開整個結構
二、輔助函式 flattenDFS(Node* node)
以 DFS 深度優先 方式展平每層串列
若節點有 child:暫存原本的 next
將 child 串接在當前節點後面
遞迴展平子串列,並接回原 next
回傳展平後的尾節點,以方便上一層接續
https://ithelp.ithome.com.tw/upload/images/20251013/201694891olIuIZY8e.png
https://ithelp.ithome.com.tw/upload/images/20251013/20169489edmyqh20EF.png

🧠 解題思路
先理解「多層級」的意義:
這題的 tricky 點在於,child 指向的可能又有自己的 child,因此是個「巢狀結構」。這時「遞迴」的直覺就該亮起來。
嘗試用 DFS 展開:
想像你在一棟大樓中,遇到樓梯(child)就先下去走完,再回到原樓層繼續走,其實就是 DFS 深度優先遍歷。
維持雙向連接:
不只是把 child 串進 next,還要修正 prev 指標,否則會造成「走得回不來」的指標地獄。
回傳尾節點以便接續:
每層 flatten 後都要知道最後一個節點是誰,才能準確接回上一層的 next。

🪶 學習心得
這題讓我重新感受到「指標的延展性」有多強大,單向串列的思維是線性的,而雙向串列則更像是有「回頭鏡」的導航。當加入 child 這層次時,問題變成立體的,指標就像在不同維度間穿梭。
一開始本來想用 stack 模擬,後來發現遞迴反而更直觀,也更理解為什麼資料結構是學指標的絕佳訓練場,因為它不只是線的連接,更是思考邏輯的延展。


上一篇
指標進階 — 操作鏈結串列的中階技巧
下一篇
指標終極整合
系列文
用leetcode系統化學習C語言30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言