題目描述(難度中)
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
鏈接
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
思路
用一前一後兩個指針,第一個指針先跑n
個node
,第二個指針再從頭跑,第一個指針跑到結尾時,第二個指針指向的node
即爲要刪除的node
。
注意:
1、輸入的鏈表沒有n
個node
時,返回NULL
2、要刪除的node
是第一個node
時,返回爲head->next
,這種情況需要特判
3、需要用一個指針記錄指向要刪除node
的上一個node
代碼
代碼沒有釋放p2
指向的內存空間,因爲使用delete
和free
都會編譯出錯,實際操作中是需要釋放的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p1 = head;
ListNode* p2 = head;
ListNode* p2pre = head;
// p1 先向前跑n下
while(n--){
if(p1){
p1 = p1->next;
}
else{
return NULL;
}
}
// 刪除的是第一個node時的特判
if(p1 == NULL){
return head->next;
}
while(p1){
p1 = p1->next;
p2pre = p2;
p2 = p2->next;
}
p2pre->next = p2->next;
return head;
}
};