19 刪除鍊錶的倒數第N個節點 雙指標一遍掃瞄

2021-10-05 15:56:38 字數 1583 閱讀 7103

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....