19 刪除鍊錶的倒數第N個節點 python

2021-09-14 01:09:29 字數 1603 閱讀 7061

題目:給定乙個鍊錶,刪除鍊錶的倒數第n個節點,再返回鍊錶的頭結點。例如給定鍊錶1->2->3->4->5,刪除n=2個節點,結果是1->2->3->5

法1:先計算鍊錶長度count,刪除倒數第n個,相當於刪除正數count-n+1=5-2+1=4個(開頭從1開始計),所以要找它前面的那個節點,也就是第3個,在上面的例子中是找到節點3,記為p,將p.next=p.next.next,就相當於刪除了p.next

這裡注意,如果鍊錶長度count=n,正好是刪除第乙個節點,直接return head.next即可。為什麼要單獨拿出來討論?因為如果鍊錶為單個節點1,n=1時,p.next.next不存在

def removenthfromend(self, head, n):

""":type head: listnode

:type n: int

:rtype: listnode

"""if head==none or n==0:return head

p,count=head,0

while p!=none:

count+=1

p=p.next

if count==n:return head.next #正好是刪除正數第乙個節點

n=count-n #正數

p=head

while n>1:

p=p.next

n-=1

p.next=p.next.next

return head

法2:快慢指標,快指標從頭開始先走n步,慢指標再從頭開始,兩指標一起走

注意,這裡快指標先走n步後,要觀察鍊錶長度與n的關係

1)如果fast==none,而n>0,說明快指標已經走到鍊錶尾部了,但還未到 倒數第n個點,此時鍊錶長度2)如果fast==none,而n==0,說明鍊錶長度正好==n,刪除的就是鍊錶的頭節點

3)鍊錶長度》n的話,比如此時fast指在節點3的位置,讓slow從頭節點1開始,每次slow與fast都走一步,直到fast指在最後乙個節點上,此時slow正好指在要刪除的節點的前乙個節點上,使得slow.next=slow.next.next

def removenthfromend(self, head, n):

""":type head: listnode

:type n: int

:rtype: listnode

"""if head==none or n==0:return head

fast=head

while n>0 and fast!=none:

fast=fast.next

n-=1

if fast==none and n>0:return head#此時n大於鍊錶長度

if fast==none and n==0:return head.next #n=鍊錶長度

slow=head

while fast.next!=none:

slow=slow.next

fast=fast.next

slow.next=slow.next.next

return head

19 刪除鍊錶的倒數第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?說實話,就我的水平而言感覺這道題坑點還真不少,先來我的乙個粗糙版...

19 刪除鍊錶的倒數第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?class solution def removenthfrom...

19 刪除鍊錶的倒數第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第n個節點,並且返回鍊錶的頭結點。給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.給定的n保證是有效的。首先遍歷得出鍊錶的長度l,然後刪除第l n個節點 definition for singly linked list....