題目:
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
分析:
雙指針。
先令虛擬節點 firHead 指向 head,設定雙指針和,初始都指向firHead。
移動,直到與之間相隔的節點個數爲 n,然後同時移動與,直到指向的爲 NULL時,的下一個節點就是要刪除的節點。
將的下個節點指向的下下個節點,就刪除了倒數第n個節點。
代碼如下:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode* firHead = new ListNode(0);
firHead->next = head;
ListNode* l = firHead;
ListNode* m = firHead;
for (int i = 0; i < n + 1; i++) {
m = m->next;
}#令兩個節點間隔n個節點
while (m) {
l = l->next;
m = m->next;
}#兩個指針同時向後移動,直到m爲NULL
ListNode* delNode = l->next;
#要刪除的節點是l後面的節點
l->next = delNode->next;
#令l指向l的下下個節點
delete delNode;
ListNode* result = firHead->next;
delete firHead;
return result;
}
};