19. 刪除鍊錶的倒數第n個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:
給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
高階:
你能嘗試使用一趟掃瞄實現嗎?
解法:很自然的想到先遍歷一遍整個鍊錶,統計有多少個節點,從而知道倒數第n個節點順數是第幾個,最後再從頭遍歷到被刪除節點前乙個位置,進行刪除操作。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
listnode* m=head;
if(n==num+1)
return head->next;
for(int i=0;inext;
}listnode * cur=m->next;
m->next=cur->next;
return head;
}};
高階:只掃瞄一遍的話,又要確定倒數第n個節點的位置,可以借助雙指標,乙個快指標,乙個慢指標,讓快指標先走n步,然後快慢指標再一起向前,等到快指標走到最後節點處,慢指標剛好走到被刪除節點前乙個位置。需要注意的是,如果要刪除節點是第乙個節點,這種情況下快指標走n步後會變成空指標。需要加個判斷條件,如果為空,直接返回第二個節點即可。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
if(p==null)return head->next;
listnode * l=head;
while(p->next!=null)
l->next=l->next->next;
return head;
}};
當然為了不需要考慮特殊情況,我們可以加乙個附加頭結點。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
listnode * l=first;
while(p->next!=null)
l->next=l->next->next;
return first->next;
}};
此外,還看到有人用空間換時間,在第一次遍歷時,用乙個陣列儲存節點,這樣也可以直接定位到被刪除節點。
總之,這題又讓我意識到雙指標的厲害之處。
之前在求三數之和、四數之和時用左右指標加快遍歷,減少一層迴圈,適合在已經排好序的陣列。現在用快慢指標進行快速定位。
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....