我正在尝试从链接列表中删除重复项。但是,我写的方法导致无限循环,我不确定为什么会有一个循环。这是我的方法:
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。无论如何,你有什么建议吗?
答案 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);
}
);