Leetcode 19 刪除連結串列的倒數第N個結點
阿新 • • 發佈:2021-02-01
技術標籤:Leetcode每日打卡_每日一道leetcode演算法資料結構
Leetcode 19 刪除連結串列的倒數第N個結點
題目描述
給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點。
進階:你能嘗試使用一趟掃描實現嗎?
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
題解1(暴力)
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* c_head = head;
ListNode* cc_head = head;
int len = 0;
while(c_head){
len++;
c_head = c_head->next;
}
int i = 1;
while (i < len - n){
cc_head = cc_head->next;
i++;
}
if( i==1 && len-1 == n ||i!=1 && cc_head->next)
cc_head->next = cc_head->next->next;
else if(i == 1 && len == n)
head = head->next;
return head;
}
};
題解2(小tips)
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* p = dummyHead;
ListNode* q = dummyHead;
//令 q和頭結點差出n+1來
for( int i = 0 ; i < n+1 ; i ++ ){
q = q->next;
}
//p、q同時向前,二者間距永遠是n,直到q到null
//此時p正好是倒數第n+1個點
while(q){
p = p->next;
q = q->next;
}
ListNode* delNode = p->next;
p->next = delNode->next;
delete delNode;
ListNode* retNode = dummyHead->next;
delete dummyHead;
return retNode;
}
};
題解3(棧)
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0, head);
ListNode* temp = dummyHead;
stack<ListNode*> cur;
while(temp){
cur.push(temp);
temp = temp->next;
}
//彈出n個 top是倒數第n+1個結點
for(int i = 0; i < n; i++){
cur.pop();
}
cur.top()->next = cur.top()->next->next;
ListNode* retNode = dummyHead->next;
delete dummyHead;
return retNode;
}
};