日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点

發(fā)布時(shí)間:2025/3/15 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

以專題的形式更新刷題貼,歡迎跟我一起學(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。