从链接列表中删除重复项

时间:2015-10-27 12:18:02

标签: java

我正在尝试从链接列表中删除重复项。但是,我写的方法导致无限循环,我不确定为什么会有一个循环。这是我的方法:

import java.util.HashSet;
import java.util.Hashtable;

public class Question {
    public static void deleteDupsB(LinkedListNode n) {
        LinkedListNode runner = null;
        LinkedListNode previous = null;
        while(n != null) {
            runner = n.next;
            while(runner != null) {
                if(n.data == runner.data) {
                    previous.next = runner.next; //This line is causing an infinite loop and I'm not sure why.
                }
                else {
                    previous = runner; 
                }
                runner = runner.next;
            }
            n = n.next;
        }
    }

    public static void main(String[] args) {    
        LinkedListNode first = new LinkedListNode(0, null, null); //AssortedMethods.randomLinkedList(1000, 0, 2);
        LinkedListNode head = first;
        LinkedListNode second = first;
        for (int i = 1; i < 8; i++) {
            second = new LinkedListNode(i % 2, null, null);
            first.setNext(second);
            second.setPrevious(first);
            first = second;
        }


        System.out.println(head.printForward());
        // LinkedListNode clone = head.clone();
        deleteDupsB(head);
        System.out.println(head.printForward());
        // deleteDupsC(clone);
        // System.out.println(clone.printForward());
    }
}

我知道它存在一些问题,例如runner最终会抛出异常。但我想我现在对此并不太担心。我认为该方法产生的效果是因为当我在第一个break循环和while内部插入second时,它会删除所有0。无论如何,你有什么建议吗?

3 个答案:

答案 0 :(得分:0)

确保对象的equals(Object)方法合理,然后将LinkedList复制到LinkedHashSet。更好的是,如果您需要消除重复项,只需使用LinkedHashSet代替LinkedList

答案 1 :(得分:0)

可能是下一个代码行中的原因:

for(...) {
    ...
    first = second;
}

你应该使用&#34; first = second&#34;仅在您的列表仅包含1个元素的情况下。

答案 2 :(得分:0)

我建议使用流。它可能效率较低,但它不易出错,节省了大量时间。

LinkedListNode list = ...;
list.stream()
    // This removes duplicates
    .distinct()
    // And this turns it back into a linked list
    .collect((Supplier<LinkedList<Integer>>) LinkedList::new, 
                LinkedList::add, 
                (left, right) -> {
                  left.addAll(right);
                }
            );