【Leetcode】19. 刪除鏈表的倒數(shù)第N個節(jié)點

要點:使用啞節(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,就是刪除第一個元素了

完。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容