iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Software Development

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

不動頭指標刪除鏈結串列中的節點

  • 分享至 

  • xImage
  •  

前幾天我們練了不少指標在陣列裡的操作,今天要來挑戰更進階的「鏈結串列 (Linked List)」
這題表面看起來只是刪一個節點,但它暗藏玄機——題目不給 head,也不給前一個節點,那還能刪嗎?
看似無解,其實正是指標魔法發揮的時刻 😎

🎯 題目介紹
LeetCode 237. Delete Node in a Linked List
給定一個「不是尾端」的節點 node,請刪除此節點
不能存取 head 或前一個節點,只能操作該節點本身
範例
鏈結串列: 4 -> 5 -> 1 -> 9 要刪除的節點是值為 5 的那個
Input: node = 5 Output: 4 -> 1 -> 9

💡 解題思路
這題看起來很詭異:我們既沒有 head,也拿不到前一個節點,那到底要怎麼刪?
但仔細想想,鏈結串列的刪除動作是什麼?
👉 改變「指標的指向」。
那既然不能動「上一個節點的 next」,我們能不能從「自己」這個節點下手?🤔
答案是——可以。
1️⃣ 複製下一個節點的資料
把下一個節點的值覆蓋到當前節點上。
2️⃣ 跳過下一個節點
讓當前節點的 next 指向「下一個節點的下一個節點」。
這樣一來,就相當於把「下一個節點」刪除了
原本那個 node 雖然還在記憶體中,但它的值跟連結都被換掉,整條鏈結串列的內容看起來就像該節點被刪掉一樣。

🧮 圖解
假設有節點:
4 -> 5 -> 1 -> 9
目標:刪除節點值為 5 的那個
步驟如下:
(1) 複製下一個節點值
node->val = node->next->val; // node=5 → node=1
(2) 跳過下一個節點
node->next = node->next->next; // 原本5->1->9 → 1->9
最終結果:
4 -> 1 -> 9

🧭 重點解析
1.此篇練的是「指標的指向操作,而非值的刪除」
2.切記不能直接 free(node),因為那樣會斷掉整條鏈
3.這題的刪除不是「真的刪掉」,而是「偽刪除」——我們用下一個節點覆蓋自己,再跳過它。
https://ithelp.ithome.com.tw/upload/images/20251010/20169489XcfMA3apvG.png


上一篇
判斷字串中特定條件
系列文
用leetcode系統化學習C語言26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言