当前位置: 首页 > 知识库问答 >
问题:

从未排序的链表中删除重复项

西门安歌
2023-03-14
import java.util.*;
/*
 *  Remove duplicates from an unsorted linked list
 */
public class LinkedListNode {  
    public int data;  
    public LinkedListNode next;  

    public LinkedListNode(int data) {  
        this.data = data;    
    }  
}

public class Task {
    public static void deleteDups(LinkedListNode head){
      Hashtable<Integer, Boolean> table=new Hashtable<Integer, Boolean>();
      LinkedListNode previous=null;
      //nth node is not null
      while(head!=null){
        //have duplicate
            if(table.containsKey(head.data)){
                            //skip duplicate
                previous.next=head.next;
            }else{
            //put the element into hashtable
            table.put(head.data,true);
            //move to the next element
            previous=head;
            }
      //iterate
      head=head.next;
      }
   }
   public static void main (String args[]){
       LinkedList<Integer> list=new LinkedList<Integer>();
       list.addLast(1);
       list.addLast(2);
       list.addLast(3);
       list.addLast(3);
       list.addLast(3);
       list.addLast(4);
       list.addLast(4);
       System.out.println(list);
       LinkedListNode head=new LinkedListNode(list.getFirst());
       Task.deleteDups(head);
       System.out.println(list);
   }
}

结果:[1,2,3,3,3,4,4][1,2,3,3,3,4,4]

共有1个答案

阚亮
2023-03-14

遍历链表,将每个元素添加到哈希表中。当我们发现一个重复的元素时,我们移除该元素并继续迭代。我们可以一次完成这一切,因为我们使用的是链表。

下面的解决方案需要O(n)个时间,n是链表中的元素数。

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;
  }
}
 类似资料:
  • 我试图从排序的单链表中删除重复的值。 这是我的密码 SinglelyLinkedListNode*移除的副本(SinglelyLinkedListNode*头){ } 然而,当单向链表为3-时,代码失败

  • 问题内容: 我想从排序的链表{0 1 2 2 3 3 4 5}中删除重复项。 ` ` prev.setNext(tempHeader)在while循环内无法正常工作。理想情况下,当prev = 2且tempHeader = 3时,prev.next应该是data = 3的节点。 Printlist函数仅使用标题指针并打印列表。 节点定义如下。 问题答案: 循环已排序,因此您知道重复项将彼此相邻。如

  • 我正在开发一个Java程序来生成一个随机数组列表,其中包含1-25个整数。然后我需要制作数组的副本并将其存储在单独的位置。虽然我能够完成这些部分,但我在实现以下方法时遇到了困难: > 存储已删除的所有重复项 这是我到目前为止的计划: 这个程序执行前两个功能,我已经探索了使用临时数组、for循环和LinkedHashSet。我的努力没有成功,我真的很感激在实施过程中得到帮助。

  • 问题内容: 数据库类型为PostGres 8.3。 如果我写了: 我有一些计数超过1的行。如何取出重复的行(我仍然希望每个行都保留1行,而不是+1行…我不想删除所有行。) 例子: 应该变成: 我找到的唯一答案是 在那里,但是我想知道是否可以在没有哈希列的情况下做到这一点。 警告 我没有具有唯一编号的PK,因此无法使用min(…)技术。PK是3个字段。 问题答案: 这是所有表都应具有主键的众多原因之

  • 本文向大家介绍Java实现删除排序链表中的重复元素的方法,包括了Java实现删除排序链表中的重复元素的方法的使用技巧和注意事项,需要的朋友参考一下 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多

  • 本文向大家介绍python无序链表删除重复项的方法,包括了python无序链表删除重复项的方法的使用技巧和注意事项,需要的朋友参考一下 题目描述: 给定一个没有排序的链表,去掉重复项,并保留原顺序 如: 1->3->1->5->5->7,去掉重复项后变为:1->3->5->7 方法: 顺序删除 递归删除 1.顺序删除 由于这种方法采用双重循环对链表进行遍历,因此,时间复杂度为O(n**2) 在遍历