1. 程式人生 > 實用技巧 >203 移除連結串列元素

203 移除連結串列元素

題目描述:刪除連結串列中等於給定值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) //{
//structListNode*p=head; //structListNode*q; //if(p->val==val) //{ //q=p; //p->next=p->next->next; //free(q); //} //else //{ //p=p->next; //} //} //returnhead; structListNode*sentry=(structListNode*)malloc(sizeof(structListNode)); sentry->next=head; structListNode*curr=head,*pre=sentry; while(curr!=NULL) { if(curr->val==val) { pre->next=curr->next; } else{ pre=curr; } curr=curr->next; } returnsentry->next; }