Type:medium
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input:1->2->3->3->4->4->5Output:1->2->5
Example 2:
Input:1->1->1->2->3Output:2->3
給定一個排好序的鏈表,刪去出現(xiàn)超過一次的所有節(jié)點硕淑。
判斷head及head->next是否為空置媳,若為空拇囊,返回head寂拆,結(jié)束。
首先設(shè)一個空的dummy節(jié)點指向head谒拴,用pre表示想要保留的節(jié)點英上,初始等于dummy苍日,pre->next指向想要保留但未確定是否只出現(xiàn)一次的節(jié)點相恃。cur指向當前遍歷的節(jié)點拦耐。
當cur->next的val等于cur->val杀糯,cur向后遍歷固翰,直至cur-next-val不等于cur-val停止骂际,此時判斷pre-next是否與cur是同一個指針方援,若不等則pre-next指向cur-next送火,若相等則pre等于pre-next种吸。最后返回dummy-next
ListNode* deleteDuplicates(ListNode* head) {
? ? ? ? if(!head || !head->next) return head;
? ? ? ? ListNode *dummy = new ListNode(-1);
? ? ? ? dummy->next = head;
? ? ? ? ListNode *pre = dummy;
? ? ? ? while(pre->next){
? ? ? ? ? ? ListNode *cur = pre->next;
? ? ? ? ? ? while(cur->next && cur->next->val == cur->val){
? ? ? ? ? ? ? ? cur = cur->next;
? ? ? ? ? ? }
? ? ? ? ? ? if(cur != pre->next) pre->next = cur->next;
? ? ? ? ? ? else pre = pre->next;
? ? ? ? }
? ? ? ? return dummy->next;
? ? }