我正在审查即将进行的测试的一些代码片段。我在笔记中看到了这一点,现在才意识到,如果列表以这种方式 A -> B -> C -> A,则方法 1 的代码实际上不会删除重复项。我写了一个替代函数(方法 2)我认为实际上会起作用。你们有什么感想?方法1实际上不起作用,我追踪它是错误的吗?ps 目前我们不允许编译器 :)
这是代码,以及它应该做什么的简短介绍。
方法1:当头部和尾部有2个确切的东西时,我认为不起作用。编写代码以从没有缓冲区的未排序列表中删除重复项。Wwe 可以使用两个指针进行迭代:“current”进行正常迭代,而“runner”迭代所有先前的节点以检查重复。Runner 每个节点只会看到一个副本,因为如果有多个副本,它们已经被删除了。
public static void deleteDuplicates1(LinkedListNode head) {
if (head == null) return;
LinkedListNode previous = head;
LinkedListNode current = previous.next;
while (current != null) {
LinkedListNode runner = head;
while (runner != current) { // Check for earlier dups
if (runner.data == current.data) {
LinkedListNode tmp = current.next; // remove current
previous.next = tmp;
current = tmp; // update current to next node
break; // all other dups have already been removed
}
runner = runner.next;
}
if (runner == current) { // current not updated - update now
previous = current;
current = current.next;
}
}
}
我在想这会奏效。方法二:
public void removeDuplicates2(){
Node current = null;
Node tracer = null;
for( current = head.next; current!=null; current=current.next){
for(tracer=head; tracer!=current; tracer=tracer.next){
if(tracer.data == current.data)
//DELETE THE NODE IN CURRENT
}
}
}