203 移除連結串列元素
阿新 • • 發佈:2020-07-14
題目描述:刪除連結串列中等於給定值val的所有節點。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
解題思路:
因為這是一道容易題,剛拿到題目就按照我設想的思路往下寫,我的思路就是遍歷,判斷值是否相等,相等則讓其下一個指標重新指向下下一個元素,下面註釋的部分是我寫出來的程式碼,執行發現這個方法執行超時了,具體原因不知道為什麼
然後看了題解的其他方法,發現val的值要考慮很多,比如說它是否出現在頭尾,或者出現在中間,而出現在頭尾的情況是我沒有考慮到的,只是設想到了val出現在中間的一般情況。
後來看到別人的方法是設定哨兵,在頭結點的前一個節點設定哨兵,這樣的話val無論出現在哪裡解決的辦法都是一樣的了。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* removeElements(struct ListNode* head, int val){ //if (head==NULL)//考慮邊緣情況 //{ //return NULL; //} //最容易想到的方法是遍歷連結串列,然後找到重複的元素之後儲存那個重複元素,然後刪除 //while(head!=NULL) //{ //struct ListNode *p=head; // struct ListNode *q; //if(p->val==val) //{ //q=p; //p->next=p->next->next; // free(q); //} //else //{ // p=p->next; // } //} //return head; struct ListNode *sentry=(struct ListNode*)malloc(sizeof(struct ListNode)); sentry->next=head; struct ListNode *curr=head,*pre=sentry; while(curr!=NULL) { if(curr->val==val) { pre->next=curr->next; } else{ pre=curr; } curr=curr->next; } return sentry->next; }
總結:
程式碼中下面寫的這種方法是要申請一個哨兵節點,然後指向頭節點。就是指標指向一個節點。
/** *Definitionforsingly-linkedlist. *structListNode{ *intval; *structListNode*next; *}; */structListNode*removeElements(structListNode*head,intval){ //if(head==NULL)//考慮邊緣情況 //{ //returnNULL; //} //最容易想到的方法是遍歷連結串列,然後找到重複的元素之後儲存那個重複元素,然後刪除 //while(head!=NULL) //{