題目:給定乙個鍊錶,刪除鍊錶的倒數第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....