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

要點(diǎn):使用啞節(jié)點(diǎn)對(duì)應(yīng)需要?jiǎng)h除鏈表第一個(gè)節(jié)點(diǎn)情況
優(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
};

光這個(gè)就折騰死我了
首先,head指針指向鏈表第一個(gè)有內(nèi)容的地址。
有一些鏈表有一個(gè)head空地址,放在鏈表最前面。這里沒有,這里不是。

然后js怎么表示鏈表,是有專門的類的,不是[1,2,3]這種數(shù)組表示,別把這種當(dāng)作參數(shù)傳進(jìn)函數(shù)里面,報(bào)錯(cuò)了你都不知道也是夠天真了我自己。都怪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 //刪掉第一個(gè)節(jié)點(diǎn)
    second.next = second.next.next
    return head

其實(shí),知道了快慢指針的原理,找bug也花了些功夫。
算法題考邏輯吧。

思路:
刪除鏈表倒數(shù)第n個(gè)元素
總體思路:讓一個(gè)指針先走n步,然后兩個(gè)指針再一起行走,直到快指針走到鏈表最后一個(gè)元素,那么這個(gè)時(shí)候慢指針也停在了要?jiǎng)h除的元素的前一個(gè)元素


圖片.png

圖片.png

圖片.png

然后就是要考慮特殊的情況進(jìn)行驗(yàn)證了。
1.刪除第一個(gè)元素,(倒數(shù)第5個(gè)元素),當(dāng)快指針走5步的話,已經(jīng)走到最后一個(gè)元素的后一個(gè)位置null,這不是我們想要看到的,所以在第一次走的時(shí)候,加上條件,當(dāng)快指針走到表尾時(shí),停止行走。

加上這個(gè)條件以后,n最后減為1的時(shí)候就停止循環(huán)了。(普通情況是減為0)
那么我們就得到判斷條件,當(dāng)n!=0,就是刪除第一個(gè)元素了

完。

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

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

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