2012-02-27 12 views
0

ソート済みリンクリスト{0 1 2 2 3 3 4 5}から重複を削除します。Javaはリンクリストから重複を削除します

`

public Node removeDuplicates(Node header) 
{ 
    Node tempHeader = null; 
    if(header != null) 
     tempHeader = header.next; 
    else return header; 
    Node prev = header; 
    if((tempHeader == null)) return header ; 

    while(tempHeader != null) 
    { 
     if(tempHeader.data != prev.data) 
     { 
      prev.setNext(tempHeader); 
     } 
    tempHeader = tempHeader.next; 
    } 
    prev = header; 
    printList(prev); 
    return tempHeader; 
} 

`

prev.setNext(tempHeader)は、whileループ内で正常に動作していません。理想的には、prev = 2かつtempHeader = 3のとき、prev.nextはデータ= 3のノードでなければなりません。

Printlist関数はヘッダポインタをとり、リストを出力します。

ノードの定義を以下に示します。

public class Node 
{ 
    int data; 
    Node next; 

    public Node getNext() { 
     return next; 
    } 
    public void setNext(Node next) { 
     this.next = next; 
    } 
} 
+0

この宿題ですか?その場合は、[宿題]タグでタグ付けしてください。 –

+0

この宿題は何ですか?また、java.util。* –

+0

を使用しない理由はありません。これは宿題ではありません。スタンフォードのウェブサイトに18のリンクされたリストの問題があり、そのうちの1つがremoveDuplicateプログラムであるPDFが見つかりました。ここにリンクがあります。 http://cslibrary.stanford.edu/105/LinkedListProblems.pdf – Junaid

答えて

2

をたくない場合は、重複が隣同士に座ってしようとしていることを知っているので、あなたは、LinkedHashSetのを使用することができます。その場でリストを編集したいのであれば、2つのリストポインタが必要です。あなたがtempHeaderとprevと呼ぶものは、あなたが行くにつれてそれらをリストの中で前進させなければなりません(コードでは見えません)。さもなければ、前のポインタを前進させなければ、tempHeaderの下の要素をリストの最初の項目と常に比較していますが、これは正しくありません。

しかし、これを行う簡単な方法は、新しいリストを作成することです。リストに追加した最後の項目の値を覚えておいてください。あなたが挿入しようとしているものが同じものならば、それを挿入しないでください。完了したら、新しいリストを返してください。

0

私は、これは

になり成し遂げるために コードリンクリストに戻るセットから重複して を排除すること、上記提案 1)の変換を設定するには、リンクされたリストのためにあなたに2つの提案を与えることができます
linkedList = new LinkedList<anything>(new HashSet<anything>(origList)); 

2)あなたは、ループがソートされている任意の重複

+0

はいいと思うが、やりたいことをやり遂げることができる。私は、C/C++でこのようにできると思います。そうじゃない? – Junaid

+0

-1:これは、リストがソートされていることを完全に無視し、後でソートする必要があります(もちろん、LinkedHashSetを使用するのではなく、単なるリニアパスよりも高価です)。 – bdares

1

この場合、戻り値は必要ありません。

public void removeDuplicates(Node list) { 
    while (list != null) { 
     // Walk to next unequal node: 
     Node current = list.next; 
     while (current != null && current.data.equals(list.data)) { 
      current = current.next; 
     } 
     // Skip the equal nodes: 
     list.next = current; 
     // Take the next unequal node: 
     list = current; 

    } 
} 
+1

+1これは、current.data.equals(list.data)をcurrent.data == list.dataに変更する点を除いて、ジョブを実行します –

1
public ListNode removeDuplicateElements(ListNode head) { 
    if (head == null || head.next == null) { 
     return null; 
    } 
    if (head.data.equals(head.next.data)) { 
     ListNode next_next = head.next.next; 
     head.next = null; 
     head.next = next_next; 
     removeDuplicateElements(head); 
    } else { 
     removeDuplicateElements(head.next); 
    } 
    return head; 
}