-1

単一リンク リスト内の重複ノードを削除するコードを作成しようとしています。
削除された重複は、次のノードに格納されている数が変更されるまでのみ削除されます。

たとえば、入力リストが の[ 0 0 0 0 1 1 0 0 0 3 3 3 1 1 0 ]場合、
出力リストは[ 0 1 0 3 1 0 ]です。
私はコードを書き込もうとし、複数のことを試しました。関数を呼び出すたびに、元のリンクされたリストまたは元の頭と元の尾だけが返されます。
一時的なリンク リストを作成し、そのリストに値を格納しようとしましたが、正しく返されません。
私の最新の試みは以下のコード スニペットであり、元のリストの先頭と末尾のみを返します。

私の質問は、このコードをどのように進めるべきですか? 私はそれを描いて視覚化しようとしましたが、役に立ちませんでした。
私は、正しい方向へのプッシュだけで書かれるコードを探しているわけではありません。
私が今持っているコードは行き止まりで、最初からやり直さなければならないかもしれないと思います。
答えを得るためにこのコードの実装を開始する最良の方法は何ですか?

public void squish() {

    SListNode current = head;
    SListNode iterator = current.next;

    while (iterator != null){
        if (current.equals(iterator)){
            iterator = iterator.next;
        } else {
            if (current.next.equals (null)) {
                break;
            } else {
                head.next = iterator;
                current = iterator;
            }
        }
    }
}
4

3 に答える 3

1

現在のソリューションでは、一度に 2 つのことを実行しようとしており、n同じ数をスキップしてリストを再配置しています。これにより、ソリューションが必要以上に複雑になります。

できることは、現在のノードがあり、その現在のノードの後に​​別のノードが続く間にループすることです。

ループ内には 2 つの可能性があります。

  • current と next の値が等しい場合、current (next) に続くノードを current next に続くノードと同じにします。
  • または値が等しくない場合、現在のノードをそのフォロワー ノードに設定してリストをウォークします。

それだけです。ヘッド参照への明示的な割り当ては必要ありません。

于 2012-09-29T19:58:06.747 に答える
0

これは宿題だと思うので、完全な解決策は示したくありません。

イテレータを直接操作するのは常に注意が必要です。単一のリストで適切に作業する代わりに、必要なソリューションで新しいリストを作成することを検討する必要があります。たとえば、概略的に...

 Create a new empty List for the result
 Initialize prevValue
 Loop over the values in input list
 If the value is not equal to the prevValue
   add it to the result list
   update prev value

もちろん、クラス/割り当てが本当にイテレータを使用することを望んでいる場合は、上記を無視してください...

于 2012-09-29T19:46:20.600 に答える
0
    public void RemoveDuplicates()
    {
        Dictionary<int, int> myDict = new Dictionary<int, int>();

        Node cur = head;

        myDict.Add(head.Data, 1);
        while (cur.Next != null)
        {
            if (myDict.ContainsKey(cur.Next.Data))
                cur.Next = cur.Next.Next;
            else
            {
                myDict.Add(cur.Next.Data, 1);
                cur = cur.Next;
            }


        }
    }
于 2014-04-12T21:38:03.080 に答える