删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点
前言
以專題的形式更新刷題貼,歡迎跟我一起學(xué)習(xí)刷題,相信我,你的堅(jiān)持,絕對(duì)會(huì)有意想不到的收獲。每道題會(huì)提供簡單的解答,如果你有更優(yōu)雅的做法,歡迎提供指點(diǎn),謝謝。
【題目描述】
給定鏈表的頭節(jié)點(diǎn)head,實(shí)現(xiàn)刪除鏈表的中間節(jié)點(diǎn)的函數(shù)。
例如:
步刪除任何節(jié)點(diǎn);
1->2,刪除節(jié)點(diǎn)1;
1->2->3,刪除節(jié)點(diǎn)2;
1->2->3->4,刪除節(jié)點(diǎn)2;
1->2->3->4-5,刪除節(jié)點(diǎn)3;
【要求】
如果鏈表的長度為 N, 時(shí)間復(fù)雜度達(dá)到 O(N), 額外空間復(fù)雜度達(dá)到 O(1)
【難度】
士:★☆☆☆
【解答】
這道題要求刪除中間節(jié)點(diǎn),我們可以采用雙指針的方法來做,就是用一個(gè)快指針和一個(gè)慢指針,快指針每次前進(jìn)兩個(gè)節(jié)點(diǎn),而慢指針每次前進(jìn)一個(gè)節(jié)點(diǎn)。當(dāng)快指針遍歷完節(jié)點(diǎn)時(shí),慢指針剛好就在中間節(jié)點(diǎn)了。之前寫過一篇一些常用的算法技巧總結(jié)也有所過指針使用的一些技巧。
不過在做的時(shí)候,最好是先把一些特殊情況先處理好,例如刪除的可能是第一個(gè)節(jié)點(diǎn),也有可能不用刪除節(jié)點(diǎn)(只有一個(gè)節(jié)點(diǎn)時(shí)就不用刪除了。
代碼如下public?static?Node?removeMidNode(Node?head)?{
if(head?==?null?||?head.next?==?null)
return?head;
if?(head.next.next?==?null)?{
return?head.next;
}
Node?fast?=?head.next.next;//快指針
Node?slow?=?head;//慢指針
//slow最終指向中間節(jié)點(diǎn)的前驅(qū)
while?(fast.next?!=?null?&&?fast.next.next?!=?null)?{
slow?=?slow.next;
fast?=?fast.next.next;
}
//進(jìn)行刪除
slow.next?=?slow.next.next;
return?head;
}上次那道刪除倒數(shù)第 K 個(gè)節(jié)點(diǎn)的題(【鏈表問題】刪除單鏈表中的第K個(gè)節(jié)點(diǎn)) 其實(shí)也是可以使用雙指針的,但個(gè)人認(rèn)為,那道題使用雙指針的方法并沒有我上次那個(gè)做法優(yōu)雅,而這次刪除中間節(jié)點(diǎn),則用雙指針比較優(yōu)雅。至于原因,可以自己打下代碼看看。
之所以說這個(gè)事,是因?yàn)橛腥烁翌}雙指針的建議,我是非常歡迎有人給我提建議的,不過你的建議如何。不過一上來就說我那篇文章太敷衍,我也是醉了。我開頭已經(jīng)說了,只提供簡單的解答,而且也把刷題的文章放到次條了。
問題拓展
題目:刪除鏈表中 a / b 處的節(jié)點(diǎn)
【題目描述】
給定鏈表的頭節(jié)點(diǎn) head、整數(shù) a 和 b,實(shí)現(xiàn)刪除位于 a/b 處節(jié)點(diǎn)的函數(shù)。
例如:
鏈表:1->2->3->4->5,假設(shè) a/b 的值為 r。
如果 r = 0,不刪除任何節(jié)點(diǎn);
如果 r 在區(qū)間 (0,1/5] 上,刪除節(jié)點(diǎn) 1;
如果 r 在區(qū)間 (1/5,2/5] 上,刪除節(jié)點(diǎn) 2;
如果 r 在區(qū)間 (2/5,3/5] 上,刪除節(jié)點(diǎn) 3;
如果 r 在區(qū)間 (3/5,4/5] 上,刪除節(jié)點(diǎn) 4;
如果 r 在區(qū)間 (4/5,1] 上,刪除節(jié)點(diǎn) 5;
如果 r 大于 1,不刪除任何節(jié)點(diǎn)。
【要求】
如果鏈表的長度為 N, 時(shí)間復(fù)雜度達(dá)到 O(N), 額外空間復(fù)雜度達(dá)到 O(1)
【難度】
士:★☆☆☆
總結(jié)
以上是生活随笔為你收集整理的删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中计算时间差的几种方法,PHP 中
- 下一篇: java美元兑换,(Java实现) 美元