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

麻烦通过链表和删除重复的项目。(一开始就管用)

傅乐湛
2023-03-14

当你收到一个号码时,你需要翻看列表,找到这个号码是否在列表中重复。如有重复,请将号码从列表中删除,并在列表前面加上新号码。如果没有重复,请在列表前加上编号。

这是正确的输出:程序的输出

这是我的LinkedList类

T`public class LinkedList 
{
Node first;
private boolean flag = true;

public void add(int item) 
{
    Node oldFirst = first;
    first = new Node();
    first.item = item;
    first.next = oldFirst;
    
    removeDuplicate(item);
}

public void show()
{
    for (Node curr = first; curr != null; curr = curr.next) 
    {
        System.out.print(curr.item + " ");
    }
    System.out.println("");
}

public int listSize()
{
    int count = 0;
    for (Node curr = first; curr != null; curr = curr.next) 
    {
        count++;
    }
    return count;
}

public void removeDuplicate(int item) 
{
    Node prev = first;

    for (Node current = prev.next; current != null && flag; current = 
    current.next)
    {
        if(current.item == item)
        {
            flag = false;
            prev.next = current.next;
        }
        prev = prev.next;      
    }
}

private class Node
{
    int item;
    Node next;
}
}

这是我的客户

    public class ListNoDuplation 
{
public static void main(String[] args) 
{
    LinkedList a = new LinkedList();
    
    // Insert: 12
    a.add(12);
    a.show();
    
    // Insert: 13
    a.add(13);
    a.show();
    
    // Insert: 14
    a.add(14);
    a.show();
    
    // Insert: 12
    a.add(12);
    a.show();
    
    // Insert: 10
    a.add(10);
    a.show();
    
    // Insert: 14
    a.add(14);
    a.show();
    
    // Insert: 12
    a.add(12);
    a.show();
    
    // Insert: 15
    a.add(15);
    a.show();
    
    // Insert: 12
    a.add(12);
    a.show();
    
    // Insert: 13
    a.add(13);
    a.show();
    
    System.out.println("List size is: " + a.listSize());
    }
}

那么这是输出:

12

13 12

14 13 12

12 14 13

10 12 14 13

14 10 12 14 13

12 14 10 12 14 13

15 12 14 10 12 14 13

12 15 12 14 10 12 14 13

13 12 15 12 14 10 12 14 13

列表大小为:9

我不明白它为什么停了。

谢谢

共有2个答案

苏富
2023-03-14

重写RemoveDuplicate方法。您当前的方法实现不正确、不清晰。

  • 当前标志值设置为false一次,但始终保持false。这是主要的bug。

提示:

>

  • 您不需要标志值。

    在检查过程中,设置curr=first.next,一如既往地先添加一个新项,然后删除重复项。因此,第一项检查是不必要的。

    在if语句中检查如果你再次找到项目,它会找到一个然后删除和中断循环。因为不可能存在一个以上价值。

    public void removeDuplicate(int item) {
        Node curr = first.next;
        Node prev = first;
        while( curr != null) {
            if(curr.item == item ) {
                prev.next = curr.next;
                break;
            }
            prev = curr;
            curr = curr.next;
        }
    }
    

  • 连俊智
    2023-03-14

    如果删除某个元素,则将flag=false设置为true,但不再将其设置为true。这意味着,在LinkedList的生命周期中移除第一个元素后,该标志仍然设置为false

    for (Node current = prev.next; current != null; current = current.next)
    {
        if(current.item == item)
        {
            prev.next = current.next;
            break; // the `break` keyword provides a much cleaner way to exit your for-loop.
        }
        prev = prev.next;      
    }
    

    侧记:一个名为flag的标志是一个很糟糕的练习,因为你从来没有看到过那个标志发出的信号。如果它只在一个方法/循环中使用,那么就不要在类级别上定义它,而是在所述方法或循环的级别上定义它。

    侧记2:在当前的实现中,以及使用break时,您将无法从列表中删除多个重复项。

     类似资料:
    • 我还有一个快速的SQL问题。考虑下表: 你看,这是一个特殊的情况。有些情况下,Value2和Value3都在一个条目中设置,有些情况下,Value2和Value3都设置了,有些情况下,它们都没有设置(没有重复项)。 所以问题是:如何删除重复项(通过Value1)并获得信息最多的条目?即,如果设置了Value2和/或Value3,则设置了这些条目。显然,我不能只使用“not null”,因为有些情况

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

    • 我对Mongo的Webservice调用返回以下JSON。我需要迭代这个JSON值并删除Item-product_语言,因为它包含NULL/空字符串。 你对怎么做有什么想法吗? Python 3.4版本。 { }

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

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

    • 问题内容: 我有两个列表需要合并,第二个列表忽略了第一个列表的重复项。..有点难以解释,所以让我展示一个代码看起来像什么,以及我想要什么的示例。 您会注意到结果具有第一个列表, 包括 其两个“ 2”值,但是second_list也具有附加的2和5值这一事实并未添加到第一个列表中。 通常,对于这样的事情,我会使用集合,但是first_list上的集合会清除它已经具有的重复值。所以我只是想知道什么是实