今後のテストに向けて、コードのスニペットをいくつかレビューしています。私はこれをメモで見ましたが、リストがこのように A -> B -> C -> A の場合、方法 1 のこのコードは実際には重複を削除しないことに気付きました。別の関数 (方法 2) を書きました。実際にうまくいくと思います。皆さんはどう思いますか?方法 1 は実際には機能しませんか? 追跡が間違っていますか? ps現時点では、コンパイラは許可されていません:)
ここにコードと、それが何をすべきかの簡単な紹介があります。
方法 1: 頭と尾に 2 つの正確なものがある場合、機能しないと思います。バッファなしでソートされていないリストから重複を削除するコードを記述します。「current」は通常の反復を行い、「runner」は以前のすべてのノードを反復して重複をチェックします。複数の重複がある場合、それらはすでに削除されているため、ランナーにはノードごとに 1 つの重複しか表示されません。
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;
}
}
}
私はこれがうまくいくと思っていました。方法 2:
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
}
}
}