私は、ノードのリストのリピート値を削除する方法

序文

  最近のブラシでは、「安全上のご証明する」タイトルの、と呼ばれているトピックリストで削除重複したノードには、私は決意ギャングスター(皿の叫び)に見え、その後、よりよい解決策を考えていなかった長い時間のためにと思いました。啓発され、外観はニマは、これは本当に素晴らしい、あまりにも、助けることができなかったが、記録問題解決のアイデアやコードこのことについてブログを書く書いて、驚きました。


タイトル説明

  でソートされたリンクリスト、重複したノードを、重複したノードリストを削除し、ノードを繰り返し保持せず、ヘッドポインタのリストが返されます。例えば、リスト1->2->3->3->4->4->5処理後です1->2->5


問題解決のためのアイデア

  この質問我々が考慮すべき2つのケースがあります。

  1. まず、第1のケース:ヘッドノードの存在の値が繰り返され、例えば1->1->1->2->3->3->4、ヘッドノード繰り返しのリストの前に3次、この時間に、我々はべき最初の三つの重複ノード1を放棄し、説明する2ように使用される新しいヘッドノード、再び続行判決;
  2. 第二のケースは、それが次のノードへの最初のノードと重複しないことであり、例えば、上記のリストは、我々はフロント除去3个1休息後2->3->3->4、この時間を、ノードの背面と繰り返さないヘッドノードは、我々は頭を予約しますノードは、続行FOUND用の後ろ、バック処理两个3我々は、2つのノードを除去するようので、元のヘッドノードとすることを、繰り返し場所除去を繰り返した後に次の位置への次の点は、それがなる2->4; 4以降であれば他を繰り返した後、我々は重複を削除し、4点を休ませてあります。


コードの実装

  実際には、上記のアイデアは、キーコードは、それを達成する方法である、と考えることは困難ではありませんか?次のコードは上記のこのアイデアの実現に兄であります:

public ListNode deleteDuplication(ListNode pHead) {
    // 若头节点为空,或者链表只有一个节点,则必没有重复,值将返回
    if(pHead == null || pHead.next == null) {
        return pHead;
    }

    // 保存头节点的下一个节点,上面已经判断了pHead.next不是空
    ListNode next = pHead.next;
    // 若头节点的值与下一个节点的值相同
    if(pHead.val == next.val) {
        do{
            // 则继续向前找出与头节点重复的节点
            // 直到找到第一个与头节点不同的节点后,退出循环
            next = next.next;
        }while(next != null && next.val == pHead.val);

        // 舍弃前面的所有重复节点,将当前第一个与头节点不同的节点作为头节点,递归调用原方法,并直接返回
        return deleteDuplication(next);
    }else {
        // 若头节点与它的下一个节点值不同,则将头节点的下一个节点作为头节点,递归调用方法
        // 并将返回值赋给头节点的next属性
        pHead.next = deleteDuplication(next);
        return pHead;
    }
}
// 以下是节点ListNode
class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

  私はポイントのコメントを追加しました上記のコードは、エディタにコピーすることができ不快参照、削除コメントが見えます。

  上記のコードは、私は再帰的な見事な(私も料理でもよい)を使用することを感じます。私はそれを解釈していますここで、完全に上記のアイデアを実装します、コメント、わずか数行のコードを削除します。

  上記のコードは最初の着信ヘッドノードが空でない、または後続のノードならば、重い、直接のリターンを行っていない、特別な文を作りました。その後、次のノード最初のヘッドノードを保存します。

  :私たちは、最初にその最初のケースの前に現在の出会うかどうかを判断するヘッドノードが重複しているこの問題が発生した場合、それは、ヘッドノードの最初の非反復まで、後方に見てきた、そして私たちは前にあきらめますノードは、このノードのヘッドノードとして、再帰的なメソッド呼び出し、新しいリストとしてバックの残りの部分に相当する戻り値に直接戻り、直接放棄前を繰り返します。

  現在のリストは、我々は前に述べた第二ケースの場合:ヘッドノードが繰り返されていない、我々は、パラメータとして次のノードにノードを向かいますが、再帰呼び出し元のメソッドは、ヘッドノードの後にサブリストの除去が新しいリストとして見られています、この方法は、再リストにサブリストは、我々はオリジナルのヘッドノードに関連付けた後、デエンファシスを完了された値を返します。

  上記のコードは、最も洗練された場所である再帰的な、オリジナルのヘッドノードを削除するには、リストの残りのデエンファシスを達成するために、新しいリスト、わずか数行のコードとして処理されます。

おすすめ

転載: www.cnblogs.com/tuyang1129/p/12177777.html
おすすめ