Remove duplicates from an unsorted linked list

前端 未结 19 974
梦如初夏
梦如初夏 2020-12-09 06:54
import java.util.*;
/*
 *  Remove duplicates from an unsorted linked list
 */
public class LinkedListNode {  
    public int data;  
    public LinkedListNode next;          


        
相关标签:
19条回答
  • 2020-12-09 07:23

    Iterate through the linked list, adding each element to a hash table. When we discover a duplicate element, we remove the element and continue iterating. We can do this all in one pass since we are using a linked list.

    The following solution takes O(n) time, n is the number of element in the linked list.

    public static void deleteDups (LinkedListNode n){
      Hashtable table = new Hashtable();
      LinkedListNode previous = null;
      while(n!=null){
          if(table.containsKey(n.data)){
              previous.next = n.next;
          } else {
              table.put(n.data, true);
              previous = n;
          }
          n = n.next;
      }
    }
    
    0 讨论(0)
  • 2020-12-09 07:24

    Here is a very easy version.

    LinkedList<Integer> a = new LinkedList<Integer>(){{
      add(1);
      add(1);
    }}
    Set<Integer> set = new HashSet<Integer>(a);
    a = new LinkedList<Integer>(set);
    

    Very concise. Isn't it?

    0 讨论(0)
  • 2020-12-09 07:25

    Ans is in C . first sorted link list sort() in nlog time and then deleted duplicate del_dip() .

    node * partition(node *start)
    {
        node *l1=start;
        node *temp1=NULL;
        node *temp2=NULL;
        if(start->next==NULL)
            return start;
    
        node * l2=f_b_split(start);
          if(l1->next!=NULL)
            temp1=partition(l1);
          if(l2->next!=NULL)
                temp2=partition(l2);
    
    if(temp1==NULL || temp2==NULL)
        {
            if(temp1==NULL && temp2==NULL)
            temp1=s_m(l1,l2);
    
            else if(temp1==NULL)
            temp1=s_m(l1,temp2);
    
            else if(temp2==NULL)
            temp1=s_m(temp1,l2);
    }
        else
                temp1=s_m(temp1,temp2);
    
        return temp1;
    }
    
    node * sort(node * start)
    {
        node * temp=partition(start);
            return temp;
    }
    
    void del_dup(node * start)
    {
      node * temp;
        start=sort(start);
        while(start!=NULL)
            {
            if(start->next!=NULL && start->data==start->next->data  )
                {
                    temp=start->next;
                    start->next=start->next->next;
                    free(temp);
                continue;
                }
            start=start->next;
            }
    }
    
    void main()
     {
        del_dup(list1);
        print(list1);
    } 
    
    0 讨论(0)
  • 2020-12-09 07:26

    All the solutions given above looks optimised but most of them defines custom Node as a part of solution. Here is a simple and practical solution using Java's LinkedList and HashSet which does not confine to use the preexisting libraries and methods.

    Time Complexity : O(n)

    Space Complexity: O(n)

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static LinkedList<?> removeDupsUsingHashSet(LinkedList<?> list) {
    
        HashSet set = new HashSet<>();
        for (int i = 0; i < list.size();) {
            if (set.contains(list.get(i))) {
                list.remove(i);
                continue;
            } else {
                set.add(list.get(i));
                i++;
            }
        }
        return list;
    }
    

    This also preserves the list order.

    0 讨论(0)
  • 2020-12-09 07:28
    1. The solution you have provided does not modify the original list.
    2. To modify the original list and remove duplicates, we can iterate with two pointers. Current: which iterates through LinkedList, and runner which checks all subsequent nodes for duplicates.
    3. The code below runs in O(1) space but O(N square) time.

      public void deleteDups(LinkedListNode head){

      if(head == null)
          return;
      
      LinkedListNode currentNode = head;       
      while(currentNode!=null){
          LinkedListNode runner = currentNode;
          while(runner.next!=null){
              if(runner.next.data == currentNode.data)
                  runner.next = runner.next.next;
              else
                  runner = runner.next;
          }
          currentNode = currentNode.next;
      }
      

      }

    Reference : Gayle laakmann mcdowell

    0 讨论(0)
  • 2020-12-09 07:28

    It's simple way without HashSet or creation Node.

    public String removeDuplicates(String str) {
        LinkedList<Character> chars = new LinkedList<Character>();
    
        for(Character c: str.toCharArray()){
            chars.add(c);
        }
    
        for (int i = 0; i < chars.size(); i++){
            for (int j = i+1; j < chars.size(); j++){
                if(chars.get(j) == chars.get(i)){
                    chars.remove(j);
                    j--;
                }
            }
        }
    
        return new String(chars.toString());
    }
    

    And to verify it:

    @Test
    public void verifyThatNoDuplicatesInLinkedList(){
        CodeDataStructures dataStructures = new CodeDataStructures();
    
        assertEquals("abcdefghjk", dataStructures.removeDuplicates("abcdefgabcdeaaaaaaaaafabcdeabcdefgabcdbbbbbbefabcdefghjkabcdefghjkghjkhjkabcdefghabcdefghjkjfghjkabcdefghjkghjkhjkabcdefghabcdefghjkj")
                .replace(",", "")
                .replace("]", "")
                .replace("[", "")
                .replace(" ", ""));
    }
    
    0 讨论(0)
提交回复
热议问题