雙指針 3 (刪除鏈表倒數(shù)第 N 個(gè)結(jié)點(diǎn) leetcode 19)

思想

雙指針?biāo)惴ú粌H應(yīng)用于鏈表,在數(shù)組等數(shù)據(jù)結(jié)構(gòu)中也有廣泛應(yīng)用。
核心思路是指向問(wèn)題中的關(guān)鍵節(jié)點(diǎn),根據(jù)問(wèn)題的上下文邏輯變換位置,最終解決問(wèn)題。

實(shí)例

刪除鏈表倒數(shù)第 N 個(gè)結(jié)點(diǎn) leetcode 19

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

輸入:
(1)head: ListNode,一個(gè)鏈表
(2)n: int,指定倒數(shù)第 n 個(gè)結(jié)點(diǎn)

輸出:
ListNode,將倒數(shù)第 n 個(gè)結(jié)點(diǎn)刪除,返回鏈表頭節(jié)點(diǎn)。

舉例:
當(dāng) head = [1,2,3,4,5], n = 2 時(shí),刪除倒數(shù)第二個(gè)節(jié)點(diǎn) 4,返回 [1,2,3,5]。

關(guān)鍵點(diǎn)

核心是表達(dá)倒數(shù)第 n 個(gè)節(jié)點(diǎn),這里的關(guān)鍵點(diǎn)是使用兩個(gè)指針,讓他們的差值是 n,當(dāng)后面的指針到達(dá)末尾的時(shí)候,前面的指針剛好是倒數(shù)第 n 個(gè)節(jié)點(diǎn)。

編碼

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


def remove_nth_node_from_end_of_list(head: ListNode, n: int) -> ListNode:
    # 邊界條件
    if n == 0:
        return head
    if n < 0:
        raise RuntimeError('invalid n')
    # 建立 dummy 節(jié)點(diǎn),方便處理邊界條件
    dummy = ListNode(next=head)
    # 雙指針初始化
    slow = fast = dummy
    # 建立雙指針的差值
    for _ in range(n):
        if fast is None:
            raise RuntimeError('nth node from end of list not exist')
        fast = fast.next
    # 定位倒數(shù)第 n 個(gè)節(jié)點(diǎn)
    while fast.next is not None:
        fast = fast.next
        slow = slow.next
    # 刪除該節(jié)點(diǎn)
    slow.next = slow.next.next
    return dummy.next

相關(guān)

雙指針 0
雙指針 1
雙指針 2

?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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