注意,這兩種刪除,其實被刪除的結點都還在,只是從頭結點開始的不斷的鏈條看起來是刪除之後的樣子,而這個鏈條上還掛着沒刪掉的小鏈子的。就是說被刪除結點的下一個結點,刪除之後是有兩個結點指向它的,一個是主鏈條上的結點,一個是‘刪除’了的結點。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;
}
};