題目連結(jié):
題目意譯:
撰寫一個(gè)函式去刪除一個(gè)單向連結(jié)串列(Singly-Linked List)中的一個(gè)節(jié)點(diǎn)。你並不能存取該串列的頭,相對(duì)地,你只會(huì)被給定將要被刪除的節(jié)點(diǎn)。
保證將要?jiǎng)h除的節(jié)點(diǎn)不會(huì)是串列中的尾端節(jié)點(diǎn)。
限制:
給定的串列之節(jié)點(diǎn)數(shù)在 [2, 1000] 的範(fàn)圍中。
-1000 ≦ Node.val ≦ 1000
每個(gè)節(jié)點(diǎn)的值是獨(dú)一無二的。
要被刪除的節(jié)點(diǎn)保證在串列中,且不是尾端節(jié)點(diǎn)。
範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: head = [4,5,1,9] 、 node = 5
輸出: [4,1,9]
解釋: 你被給定值為 5 的第二個(gè)節(jié)點(diǎn),在呼叫你的函式後連結(jié)串列應(yīng)變?yōu)?4 -> 1 -> 9 。
範(fàn)例 2:
輸入: head = [4,5,1,9] 、 node = 1
輸出: [4,5,9]
解釋: 你被給定值為 1 的第三個(gè)節(jié)點(diǎn),在呼叫你的函式後連結(jié)串列應(yīng)變?yōu)?4 -> 5 -> 9 。
範(fàn)例 3:
輸入: head = [1,2,3,4] 、 node = 3
輸出: [1,2,4]
範(fàn)例 4:
輸入: head = [0,1] 、 node = 0
輸出: [1]
範(fàn)例 5:
輸入: head = [-3,5,-99] 、 node = -3
輸出: [5,-99]
解題思維:
因?yàn)槭菃蜗虻倪B結(jié)串列,因此無法存取到前一個(gè)節(jié)點(diǎn)。但是我們?nèi)钥梢源嫒∠乱粋€(gè)節(jié)點(diǎn),以及其後的節(jié)點(diǎn)。
假設(shè)目前節(jié)點(diǎn)為 N 。因?yàn)槊總€(gè)節(jié)點(diǎn)的值都不一樣,因此我們可以把 N 的值更改為其下一個(gè)節(jié)點(diǎn)的值(N->next),而且根據(jù)題目的保證 N 一定有下一個(gè)節(jié)點(diǎn),所以不用擔(dān)心複製不到值。
再來,將 N->next 指向下一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)(N->next->next)。此時(shí),連結(jié)串列的結(jié)構(gòu)即變得像是將目標(biāo)節(jié)點(diǎn)刪除一樣(儘管沒有真的刪掉目標(biāo)節(jié)點(diǎn))。
最後就看個(gè)人(或是程式語(yǔ)言本身)要不要?jiǎng)h掉 N 原本的下一個(gè)節(jié)點(diǎn),釋放已經(jīng)沒有使用的記憶體。
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。