1戳寸、題目
示例1:
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]
2、代碼
def removeNthFromEnd(self, head, n):
"""
(1)創(chuàng)建一個虛擬頭結(jié)點 dummy拷泽,并將它指向原鏈表的頭結(jié)點 head疫鹊。
(2)定義兩個指針 fast 和 slow,初始時都指向虛擬頭結(jié)點司致。
(3)快指針 fast 先向前移動 n 步拆吆,即 for i in range(n+1): fast = fast.next。
(4)同時移動快指針和慢指針蚌吸,直到快指針 fast 到達鏈表的末尾锈拨。使用循環(huán) while fast:,循環(huán)內(nèi)部的操作為 fast = fast.next 和 slow = slow.next羹唠。
此時奕枢,慢指針 slow 所指向的節(jié)點就是要刪除的節(jié)點的前一個節(jié)點。
(5)將慢指針 slow 所指向的節(jié)點的 next 指針指向下一個節(jié)點的 next 指針佩微,即 slow.next = slow.next.next缝彬,實現(xiàn)刪除倒數(shù)第 n 個節(jié)點。
(6)返回 dummy.next哺眯,即為新鏈表的頭結(jié)點
"""
dummy = ListNode(0) # 創(chuàng)建一個虛擬頭結(jié)點谷浅,值為0
dummy.next = head # 將虛擬頭結(jié)點指向原鏈表的頭結(jié)點
fast = dummy # 快指針初始指向虛擬頭結(jié)點
slow = dummy # 慢指針初始指向虛擬頭結(jié)點
for i in range(n + 1): # 快指針先向前移動n步(包括虛擬頭結(jié)點)
fast = fast.next
while fast: # 同時移動快指針和慢指針,直到快指針到達鏈表末尾
fast = fast.next # 快指針每次移動一步
slow = slow.next # 慢指針每次移動一步
slow.next = slow.next.next # 刪除倒數(shù)第n個節(jié)點奶卓,將慢指針指向的節(jié)點的next指針指向下一個節(jié)點的next指針
return dummy.next # 返回鏈表的頭結(jié)點