題目
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
來源:力扣(LeetCode)
思路
首先,要考慮的是,如何找到倒數第N個節點,因爲只允許一次遍歷,所以不能用一次完整的遍歷來統計鏈表中元素的個數,而是遍歷到對應位置就應該移除了;
然後,需要用兩個指針,pre 和 cur 指針,先是 cur 指針先向前走N步,如果此時 cur 指向空,說明N爲鏈表的長度,則需要移除的爲首元素,那麼此時返回 head->next 即可,如果 cur 存在,再繼續往下走,此時 pre 指針也跟着走,直到 cur 爲最後一個元素時停止,此時 pre 指向要移除元素的前一個元素;
最後,再修改指針跳過需要移除的元素即可,
C++代碼
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
if (!head -> next)
return NULL;
ListNode *pre = head, *cur = head;
for (int i = 0; i < n; ++i)
{
cur = cur -> next;
}
if(!cur)
{
return head -> next;
}
while (cur -> next)
{
cur = cur -> next;
pre = pre -> next;
}
pre -> next = pre -> next -> next;
return head;
}
};