Data structures 在链表中查找重复值(简单转换为困难)

Data structures 在链表中查找重复值(简单转换为困难),data-structures,linked-list,traversal,Data Structures,Linked List,Traversal,这似乎是一个非常简单的问题。面试官让我在链表中找到重复的元素,然后他告诉我一些让我难以回答的限制。限制条件是您只需遍历链接列表一次 资源 我唯一可用的资源是另一个链表 奖金 如果只能遍历该元素一次,请删除该元素 时间应为O(N) 问题1:我找不到答案,我不知道解决方案是否存在,或者他只是把我弄糊涂了。。。如果是,那怎么可能呢?您可以使用HashMap,如果这是用Java实现的,我们可以使用数据结构 映射存储键值对,元素几乎可以访问O(1),因此此代码段在O(n) private void rem

这似乎是一个非常简单的问题。面试官让我在链表中找到重复的元素,然后他告诉我一些让我难以回答的限制。限制条件是您只需遍历链接列表一次

资源

我唯一可用的资源是另一个链表

奖金

如果只能遍历该元素一次,请删除该元素

时间应为O(N)


问题1:我找不到答案,我不知道解决方案是否存在,或者他只是把我弄糊涂了。。。如果是,那怎么可能呢?

您可以使用
HashMap
,如果这是用Java实现的,我们可以使用数据结构 映射存储键值对,元素几乎可以访问
O(1)
,因此此代码段在
O(n)

private void removeDuplicates(最终节点){
Map Map=newhashmap();
节点n=节点;
Node prev=null;
while(n!=null){
if(map.get(n.data)==null){
map.put(n.data,true);
}
否则{
System.out.println(“发现重复的:”+n.data);
/*要删除重复项,请执行此操作
如果(n.next!=null){
n、 数据=n.next.data;
n、 next=n.next.next;
继续;
}
如果(上一个!=null){
上一个=下一个;
}
*/
}
prev=n;
n=n.next;
} 
}

您可以使用
HashMap
,如果要在Java中实现,我们可以使用数据结构 映射存储键值对,元素几乎可以访问
O(1)
,因此此代码段在
O(n)

private void removeDuplicates(最终节点){
Map Map=newhashmap();
节点n=节点;
Node prev=null;
while(n!=null){
if(map.get(n.data)==null){
map.put(n.data,true);
}
否则{
System.out.println(“发现重复的:”+n.data);
/*要删除重复项,请执行此操作
如果(n.next!=null){
n、 数据=n.next.data;
n、 next=n.next.next;
继续;
}
如果(上一个!=null){
上一个=下一个;
}
*/
}
prev=n;
n=n.next;
} 
}


所以链表中只有一个重复的元素?可能有一个或多个…@nakiya你收到我的问题了吗?是的,不幸的是,我想不出这种情况下的O(n)算法。链表是排序的还是未排序的?所以链表中只有一个重复的元素?可能有一个或多个…@nakiya你收到我的问题了吗,不幸的是,我想不出适用于这种情况的O(n)算法。列表是已排序的还是未排序的?这似乎很好。。但是在大O(n)中,资源就是列表,列表没有解决方案吗?@Malik我不确定我是否正确理解你的评论,你是在问我们是否可以不使用地图就做吗?是的,如果我们可以不使用地图就做吗?@Malik我不认为我们可以不使用地图就做,如果在这样做之前知道数据的类型,比如,如果已知数据是字母表中的小写字母,我们可以使用大小为26的布尔数组instead@Malik如果你使用的是其他没有地图的语言,你应该自己写一张地图,看看地图是如何工作的这似乎很好。。但是在大O(n)中,资源就是列表,列表没有解决方案吗?@Malik我不确定我是否正确理解你的评论,你是在问我们是否可以不使用地图就做吗?是的,如果我们可以不使用地图就做吗?@Malik我不认为我们可以不使用地图就做,如果在这样做之前知道数据的类型,比如,如果已知数据是字母表中的小写字母,我们可以使用大小为26的布尔数组instead@Malik如果你正在使用其他没有地图的语言,你应该自己写一张地图,阅读地图是如何工作的
private void removeDuplicates(final Node node) {
     Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();

     Node n = node;
     Node prev = null;
     while (n != null) {
         if (map.get(n.data) == null) {
             map.put(n.data, true);
         }
         else {
             System.out.println("Found Duplicate of: "+n.data);

             /*To remove duplicates. do this
             if (n.next != null) {
                 n.data = n.next.data;
                 n.next = n.next.next;
                 continue;
             }
             if (prev != null) {
                 prev.next = n.next;
             }
             */
        }
        prev = n;
        n = n.next;
    } 

}