C++ 中從已排序的連結串列中刪除重複項


假設我們有一個已排序的連結串列;我們必須刪除所有重複項,使每個元素只出現一次。

因此,如果輸入類似於 [1,1,2,3,3,3,4,5,5],則輸出將是 [1,2,3,4,5]

要解決這個問題,我們將遵循以下步驟 −

  • dummy := 建立一個新節點,其值為 -inf

  • dummy 的下一項 := head

  • curr = dummy

  • 當 curr 非零時,執行 −

    • next = curr 的下一項

    • 當 (next 不為 null 且 next 的值為 same as curr 的值) 時,執行 −

      • next := next 的下一項

    • curr 的下一項 := next

    • curr := next

  • 返回 dummy 的下一項

示例

讓我們看看以下實現,以獲得更好的理解 −

 線上演示

#include <bits/stdc++.h>
using namespace std;
class ListNode{
   public:
      int val;
      ListNode *next;
      ListNode(int data){
         val = data;
         next = NULL;
      }
};
ListNode *make_list(vector<int> v){
   ListNode *head = new ListNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      ListNode *ptr = head;
      while(ptr->next != NULL){
         ptr = ptr->next;
      }
      ptr->next = new ListNode(v[i]);
   }
   return head;
}
void print_list(ListNode *head){
   ListNode *ptr = head;
   cout << "[";
   while(ptr){
      cout << ptr->val << ", ";
      ptr = ptr->next;
   }
   cout << "]" << endl;
}
class Solution {
public:
   ListNode* deleteDuplicates(ListNode* head) {
      ListNode*dummy = new ListNode(INT_MIN);
      dummy->next = head;
      ListNode * curr = dummy;
      while(curr){
         ListNode * next = curr->next;
         while(next && next->val==curr->val)
            next = next->next;
         curr->next = next;
         curr=next;
      }
      return dummy->next;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,1,2,3,3,3,4,5,5};
   ListNode *head = make_list(v);
   print_list(ob.deleteDuplicates(head));
}

輸入

{1,1,2,3,3,3,4,5,5}

輸出

[1, 2, 3, 4, 5, ]

更新於:2020 年 6 月 10 日

1K+ 瀏覽量

開啟你的職業生涯

完成課程獲得認證

開始
Advertisements
© . All rights reserved.