1. 程式人生 > 其它 >Leetcode 19 刪除連結串列的倒數第N個結點

Leetcode 19 刪除連結串列的倒數第N個結點

技術標籤: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;
    }
};

提交結果