給定一個(gè)鏈表愕难,刪除鏈表的倒數(shù)第n?個(gè)節(jié)點(diǎn)偎快,并且返回鏈表的頭結(jié)點(diǎn)顷链。
示例:
給定一個(gè)鏈表:1->2->3->4->5, 和n= 2.當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后橄抹,鏈表變?yōu)?b>1->2->3->5.
說明:
給定的?n保證是有效的蜜笤。
進(jìn)階:
你能嘗試使用一趟掃描實(shí)現(xiàn)嗎濒蒋?
看看給的東西,head是鏈表把兔,n是倒數(shù)第n個(gè)節(jié)點(diǎn)沪伙,
先看看head是什么
ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 5, next: None}}}}}
字典,鍵值對組成县好,key為數(shù)值围橡,value為指針,最后一層元素的value是None缕贡,及尾節(jié)點(diǎn)的指針為空
如果我們正常知道節(jié)點(diǎn)位置翁授,那么可以用x.val = x.next.val? x.next = x.next.next刪除節(jié)點(diǎn)
或者直接跳過這個(gè)節(jié)點(diǎn)拣播,讓下一個(gè)節(jié)點(diǎn)指針指向下一個(gè)節(jié)點(diǎn),然后返回頭結(jié)點(diǎn)收擦,鏈表給的是頭結(jié)點(diǎn)贮配,通過頭結(jié)點(diǎn)找到后續(xù)節(jié)點(diǎn)。
然后就是如何找到這個(gè)節(jié)點(diǎn)了塞赂,知道是倒數(shù)第N個(gè)泪勒,給了鏈表,那就去找這個(gè)鏈表的長度宴猾。
那就遍歷這個(gè)鏈表圆存,從頭節(jié)點(diǎn)開始,如果下一個(gè)節(jié)點(diǎn)不為空仇哆,那就是存在節(jié)點(diǎn)沦辙,進(jìn)行計(jì)數(shù)
如果長度為1,那么計(jì)數(shù)為0税产,起始的head 等于None
最后i就是鏈表長度怕轿,然后知道長度偷崩,就知道是第幾個(gè)節(jié)點(diǎn)辟拷,
然后要對n進(jìn)行判斷,如果n是1阐斜,那么就是刪除唯一的節(jié)點(diǎn)衫冻,那么就應(yīng)該返回空,輸入的是列表谒出,返回的就是列表隅俘,[ ]
然后是是去除這個(gè)節(jié)點(diǎn),找到這個(gè)節(jié)點(diǎn)前一個(gè)節(jié)點(diǎn)是最簡單的辦法笤喳,倒數(shù)第n個(gè)为居,就是正數(shù)
i - n + 1
前一個(gè)就是i - n + 1 -1?
然后去尋找這個(gè)節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),起始為第1個(gè)節(jié)點(diǎn)杀狡,讓他等于第二個(gè)節(jié)點(diǎn)蒙畴,進(jìn)行一次操作,for i in range(1)
所以應(yīng)該是for i in range(i - n -1):然后這個(gè)節(jié)點(diǎn)指向下下個(gè)節(jié)點(diǎn)呜象,
然后還有一種情況膳凝,n=i,那么就是刪除第一個(gè)節(jié)點(diǎn)恭陡,那就直接返回head.next
對于鏈表我屬實(shí)一知半解的蹬音,做兩道題收獲不少,繼續(xù)努力休玩。
學(xué)習(xí)的另一種辦法
關(guān)鍵在于如何倒數(shù)著淆,這種方法先正數(shù)N個(gè)劫狠,然后再前面添加任意個(gè)數(shù),直到達(dá)到長度牧抽。
(具體實(shí)現(xiàn)不是這樣的嘉熊,但是這種想法)
先賦值一個(gè)鏈表A首先走N步,然后另開一個(gè)鏈表B再繼續(xù)走,直到A走到頭扬舒,這時(shí)B的末尾就是倒數(shù)第N個(gè)