標籤:style blog color for io 代碼
今天做了Leetcode上面一道題Remove Duplicates from Sorted List II,要去去除鏈表中重複的節點,代碼如下
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:11 ListNode *deleteDuplicates(ListNode *head) {12 if(head==NULL||head->next==NULL)13 {14 return head;15 }16 ListNode *p=head,*prev=new ListNode(0),*head2=prev;17 int count=0;18 while(p->next!=NULL)19 {20 if(count==0&&p->val!=p->next->val)21 {22 prev->next=p;23 prev=p;24 }25 else if(p->val==p->next->val)26 {27 count++;28 }29 else if(count>0)30 {31 count=0; 32 }33 p=p->next;34 }35 if(count==0)36 {37 prev->next=p;38 }39 // else40 //{41 // prev->next=NULL;42 //}43 head=head2->next;44 delete head2;45 return head;46 }47 };
注意到39-42行被注釋掉的代碼,注釋掉,會怎麼樣?
分析一下演算法,count表示前面與當前指標val相等的節點個數,對於末尾指標,前面如果沒有與其數值相等,則加入鏈表,否則,則不加入鏈表,但是,如果末尾指標前面存在與其相等的數,是不是可以不用管它?不是的,因為是原地對鏈表操作,所以如果不處理的畫,那麼最後prev的next還是會指向另一個節點,而這個節點並不是我們想要的,所以39-42行必須將prev的next指向null 指標。當然對於存在重複的節點,可以直接delete之,如果該節點是分配到堆上的話。