(重點)Remove Linked List Elements和Delete Node in a Linked List

注意,這兩種刪除,其實被刪除的結點都還在,只是從頭結點開始的不斷的鏈條看起來是刪除之後的樣子,而這個鏈條上還掛着沒刪掉的小鏈子的。就是說被刪除結點的下一個結點,刪除之後是有兩個結點指向它的,一個是主鏈條上的結點,一個是‘刪除’了的結點。leetcode可能不管,但是覺得在用的時候要把這個結點delete掉。

1->2->8->6->5  

 刪除掉2:1->8->6->5

                          ^

                          |

                         2

(湊合看吧不知道怎麼編輯,就是2就是那個出來小鏈子,沒delete,所以2還是指向8的)

刪掉1:1->2->8->6->5   你可能會問我這不是沒刪嗎,刪了的原因是我現在返回的新的指向頭結點的指針是指向2的,不是指向1,所以這樣看就刪掉了。下面的解法頭結點就是這麼處理的,把head改了,但是1還是有的,它的next還是指向2的。

能突出體現的就是這兩種解法關於頭結點的是另一道題,Delete Node in a Linked List:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        //ListNode **cur=&node;
        //*cur=(*cur)->next;
        *node=*(node->next);
    }
};

註釋裏按照前一道題的刪除不對的原因就是頭結點相當於沒刪除.....然後辦法就是直接把指針指向的結點改了......


前一道題解法:

刪除操作,**是可以不考慮head的特殊情況的:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode **cur=&head;              //如果又想不明白了,就算地址,就是把每個指針是誰的地址列出來,就能整明白這個**了。  
        while((*cur)!=NULL)   
        {
            if((*cur)->val==val)
            {
                (*cur)=(*cur)->next;     //如果刪頭結點,cur存了head的地址,*cur就是head,現在把*cur改了,就是把head的內容改了,還是叫head,但head的內容變了,變成了第二個結點的指針。
            }                            //其餘結點以此類推,就是把指向這個結點的指針用另一個指針指着(另一個指針存着指向結點指針的地址),然後通過這個指針改掉指向結點的指針的內容,就達到了刪除結點的效果。
            else
            {
                cur=&((*cur)->next);
            }
        }
        return head;
    }
};

自己編的考慮特殊情況只用*的·:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode *cur=head;
        while(cur!=NULL&&cur->val==val)
        {
            head=cur->next;
            cur=cur->next;
        }
        while(cur!=NULL&&cur->next!=NULL)
        {
            if(cur->next->val==val)
            {
                cur->next=cur->next->next;
            }
            else
            {
                cur=cur->next;
            }
        }
        return head;
    }
};

遞歸·:


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head==NULL)
        {
            return NULL;
        }
        head->next=removeElements(head->next,val);
        return head->val==val?head->next:head;
       
    }
};


發佈了56 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章