📌  相关文章
📜  用于从未排序的链表中删除重复项的Java程序

📅  最后修改于: 2022-05-13 01:55:50.193000             🧑  作者: Mango

用于从未排序的链表中删除重复项的Java程序

编写一个 removeDuplicates()函数,该函数接受一个列表并从列表中删除任何重复的节点。该列表未排序。
例如,如果链表是 12->11->12->21->41->43->21,那么 removeDuplicates() 应该将链表转换为 12->11->21->41->43。

方法 1(使用两个循环):
这是使用两个循环的简单方法。外循环用于一一选择元素,内循环将选择的元素与其余元素进行比较。
感谢 Gaurav Saxena 帮助编写此代码。

Java
// Java program to remove duplicates from 
// unsorted linked list
class LinkedList 
{
    static Node head;
    static class Node 
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    /* Function to remove duplicates from an
       unsorted linked list */
    void remove_duplicates()
    {
        Node ptr1 = null, 
             ptr2 = null, dup = null;
        ptr1 = head;
  
        // Pick elements one by one 
        while (ptr1 != null && 
               ptr1.next != null) 
        {
            ptr2 = ptr1;
  
            /* Compare the picked element with 
               rest of the elements */
            while (ptr2.next != null) 
            {
                // If duplicate then delete it 
                if (ptr1.data == ptr2.next.data) 
                {
                    // Sequence of steps is important here
                    dup = ptr2.next;
                    ptr2.next = ptr2.next.next;
                    System.gc();
                }
                else 
                    ptr2 = ptr2.next;
                }
            }
            ptr1 = ptr1.next;
        }
    }
  
    void printList(Node node)
    {
        while (node != null) 
        {
            System.out.print(node.data + " ");
            node = node.next;
        }
    }
  
    public static void main(String[] args)
    {
        LinkedList list = new LinkedList();
        list.head = new Node(10);
        list.head.next = new Node(12);
        list.head.next.next = new Node(11);
        list.head.next.next.next = new Node(11);
        list.head.next.next.next.next = new Node(12);
        list.head.next.next.next.next.next = new Node(11);
        list.head.next.next.next.next.next.next = new Node(10);
  
        System.out.println(
               "Linked List before removing duplicates : ");
        list.printList(head);
  
        list.remove_duplicates();
        System.out.println("");
        System.out.println(
               "Linked List after removing duplicates : ");
        list.printList(head);
    }
}
// This code is contributed by Mayank Jaiswal


Java
// Java program to remove duplicates
// from unsorted linkedlist
import java.util.HashSet;
  
public class removeDuplicates 
{
    static class node 
    {
        int val;
        node next;
  
        public node(int val) 
        {
            this.val = val;
        }
    }
      
    /* Function to remove duplicates from a
       unsorted linked list */
    static void removeDuplicate(node head) 
    {
        // Hash to store seen values
        HashSet hs = new HashSet<>();
      
        // Pick elements one by one 
        node current = head;
        node prev = null;
        while (current != null) 
        {
            int curval = current.val;
              
             // If current value is seen before
            if (hs.contains(curval)) 
            {
                prev.next = current.next;
            } 
            else 
            {
                hs.add(curval);
                prev = current;
            }
            current = current.next;
        }
  
    }
      
    // Function to print nodes in a given 
    // linked list 
    static void printList(node head) 
    {
        while (head != null) 
        {
            System.out.print(head.val + " ");
            head = head.next;
        }
    }
  
    public static void main(String[] args) 
    {
        /* The constructed linked list is:
           10->12->11->11->12->11->10*/
        node start = new node(10);
        start.next = new node(12);
        start.next.next = new node(11);
        start.next.next.next = new node(11);
        start.next.next.next.next = new node(12);
        start.next.next.next.next.next = new node(11);
        start.next.next.next.next.next.next = new node(10);
  
        System.out.println(
               "Linked list before removing duplicates :");
        printList(start);
  
        removeDuplicate(start);
  
        System.out.println(
               "Linked list after removing duplicates :");
        printList(start);
    }
}
// This code is contributed by Rishabh Mahrsee


输出:

Linked list before removing duplicates:
10 12 11 11 12 11 10 
Linked list after removing duplicates:
10 12 11

时间复杂度:O(n^2)

方法2(使用排序):
一般来说,合并排序是最适合有效排序链表的排序算法。
1) 使用合并排序对元素进行排序。我们很快就会写一篇关于排序链表的文章。 O(nLogn)
2)使用在排序的链表中删除重复项的算法在线性时间内删除重复项。在)
请注意,此方法不会保留元素的原始顺序。
时间复杂度: O(nLogn)

方法 3(使用散列):
我们从头到尾遍历链接列表。对于每个新遇到的元素,我们检查它是否在哈希表中:如果是,我们将其删除;否则我们把它放在哈希表中。

Java

// Java program to remove duplicates
// from unsorted linkedlist
import java.util.HashSet;
  
public class removeDuplicates 
{
    static class node 
    {
        int val;
        node next;
  
        public node(int val) 
        {
            this.val = val;
        }
    }
      
    /* Function to remove duplicates from a
       unsorted linked list */
    static void removeDuplicate(node head) 
    {
        // Hash to store seen values
        HashSet hs = new HashSet<>();
      
        // Pick elements one by one 
        node current = head;
        node prev = null;
        while (current != null) 
        {
            int curval = current.val;
              
             // If current value is seen before
            if (hs.contains(curval)) 
            {
                prev.next = current.next;
            } 
            else 
            {
                hs.add(curval);
                prev = current;
            }
            current = current.next;
        }
  
    }
      
    // Function to print nodes in a given 
    // linked list 
    static void printList(node head) 
    {
        while (head != null) 
        {
            System.out.print(head.val + " ");
            head = head.next;
        }
    }
  
    public static void main(String[] args) 
    {
        /* The constructed linked list is:
           10->12->11->11->12->11->10*/
        node start = new node(10);
        start.next = new node(12);
        start.next.next = new node(11);
        start.next.next.next = new node(11);
        start.next.next.next.next = new node(12);
        start.next.next.next.next.next = new node(11);
        start.next.next.next.next.next.next = new node(10);
  
        System.out.println(
               "Linked list before removing duplicates :");
        printList(start);
  
        removeDuplicate(start);
  
        System.out.println(
               "Linked list after removing duplicates :");
        printList(start);
    }
}
// This code is contributed by Rishabh Mahrsee

输出:

Linked list before removing duplicates:
10 12 11 11 12 11 10 
Linked list after removing duplicates:
10 12 11

感谢 Bearwang 提出这种方法。
时间复杂度:平均 O(n)(假设哈希表访问时间平均为 O(1))。

有关详细信息,请参阅有关从未排序的链接列表中删除重复项的完整文章!