要點:使用啞節(jié)點對應(yīng)需要刪除鏈表第一個節(jié)點情況
優(yōu)化:單次遍歷:使用快慢指針??炻羔樀氖褂糜执蜷_了新世界大門!
第一種方法:遍歷兩次
var removeNthFromEnd = function(head, n) {
let tail = head
let len = 1
while (tail.next) {
tail = tail.next
len++
}
if (n == len) return head.next
tail = head
for (let i = 0; i < len - n - 1; i++) {
tail = tail.next
}
tail.next=tail.next.next
return head
};
光這個就折騰死我了
首先,head指針指向鏈表第一個有內(nèi)容的地址。
有一些鏈表有一個head空地址,放在鏈表最前面。這里沒有,這里不是。
然后js怎么表示鏈表,是有專門的類的,不是[1,2,3]這種數(shù)組表示,別把這種當(dāng)作參數(shù)傳進(jìn)函數(shù)里面,報錯了你都不知道也是夠天真了我自己。都怪leetcode編輯器誤導(dǎo)人。
好氣呀
氣自己那么慢,那么蠢
第二種方法:快慢指針
let first = head
let second = head
while (first.next && n > 0) {
first = first.next
n--
}
while (first.next) {
first = first.next
second = second.next
}
if (second == head && n!=0) return head.next //刪掉第一個節(jié)點
second.next = second.next.next
return head
其實,知道了快慢指針的原理,找bug也花了些功夫。
算法題考邏輯吧。
思路:
刪除鏈表倒數(shù)第n個元素
總體思路:讓一個指針先走n步,然后兩個指針再一起行走,直到快指針走到鏈表最后一個元素,那么這個時候慢指針也停在了要刪除的元素的前一個元素

圖片.png

圖片.png

圖片.png
然后就是要考慮特殊的情況進(jìn)行驗證了。
1.刪除第一個元素,(倒數(shù)第5個元素),當(dāng)快指針走5步的話,已經(jīng)走到最后一個元素的后一個位置null,這不是我們想要看到的,所以在第一次走的時候,加上條件,當(dāng)快指針走到表尾時,停止行走。
加上這個條件以后,n最后減為1的時候就停止循環(huán)了。(普通情況是減為0)
那么我們就得到判斷條件,當(dāng)n!=0,就是刪除第一個元素了
完。