安全プランを証明する:レプリケーションの複雑なリスト(javaの)

タイトル:複素関数ComplexListNodeのコピーリストを実装します。複合リンクされたリストは、各ノードが次のノードへのポインタにm_pNext加算を有し、リンクされたリストまたはNULL内の任意のノードをm_pSibling点があります。

   以下は含んで5 リスト・ノードの複合型の。実線矢印が示すm_pNext ポインタ破線矢印m_pSibling ポインタ。簡単にするために、ポイントのNULL ポインタが示されていません。

                  コピーの複雑なチェーン -   - ハイタオ - マイクロソフト、Googleや他の顔の質問注目のプログラマが質問に100個の質問(49)に臨みます

    最初のステップは、元のリスト上の各リストをコピーすることであり、で:問題を参照してください、私の最初の反応は、2つの段階に分けたm_pNext リンク。ノードの元のリストと仮定する第二工程、Nはm_pSibling ポイントノードSを以来、Sの位置は、リスト上で可能であるN にしてもよい先行N 後ろので、標的とするために、N個の検索位置を我々は、元のノードのリンクリストの先頭から開始する必要があります。リンクリストの先頭から元のノードが経過したと仮定し、S ノード見つけるステップSをリストに次にコピーされたノードN m_pSibling S ' 、リストコピーノードの先頭からの距離であるS 私たちは、コピーリスト上の各ノードに対してこのように設定することができますm_pSibling アップ。

          対を含むn個のノードのリンクリストを、位置決めするので、各ノードm_pSibling 、ノードにリストニーズの先頭から経過したO(n)は、この方法の総時間複雑であるので、検索するには、手順O(N 2

           この方法の時間は、主ノードの位置決めに費やされているのでm_pSibling 上記を、私たちは、この点で最適化を行うにしてみてください。我々はまだ2つのステップに分割された:最初のステップは、各ノードは、元のリストに残っているコピーすることであるN 、及び作成'Nを、次いで、これらのノードのうちの作成がリンクされています。ここで、<N 、N 「> ハッシュテーブルにペア情報へ。第二のステップは、リスト上の各ノードをコピーするように構成されているm_pSibling 元のリンクされたリスト内のノード場合N m_pSiblingのノードをポイントS リストをコピーし、その後、対応するN「が指すべきS」をハッシュテーブルのおかげで、我々は使用することができますO(1)に従って時間をS 見つける'Sを

           までの時間のためのスペースに第二の方法の対応するO(N)スペース消費量が達成O(N)時間効率。

    次バック考え方にたち、補助スペースを使用せずにO(n)の時間効率を達成します。第三の方法の最初のステップは、元のリストに従って、各ノードNに対応するNを作成することがあります今回は、以下のNにN」のリンクを置きます

    第二段階m_pSiblingは、ノードをコピーします。Nが原点m_pSiblingノードSのリストが、Nうち、対応するコピーと仮定する「m_pnextポイントノードで、同じS」はS、m_pNextポイントノードです。

    第三のステップは、2つのリストにこの長いリストを分割することである:奇数の位置との接合がm_pnext初期リストにリンクされ、m_pnextによってリンクされたノードの偶数位置をリストからコピーされます。 

public class Solution {
    public ComplexListNode Clone(ComplexListNode pHead)
    {
        if(pHead == null){
            return null;
        }
        //复制接结点
        CloneNodes(pHead);

        //连接随机指针
        ConnectSiblingNodes(pHead);

        //拆分链表
        return ReconnectNodes(pHead);

    }
    public static void CloneNodes(ComplexListNode pHead){
        ComplexListNode pNode = pHead;
        while(pNode != null){
            ComplexListNode pCloned = new ComplexListNode(pNode.label);
            pCloned.m_pnext = pNode.m_pnext;
            pCloned.m_pSibling = null;

            pNode.m_pnext = pCloned;
            pNode = pCloned.m_pnext;
        }


    }
    public static void ConnectSiblingNodes(ComplexListNode pHead){
        RandomListNode pNode = pHead;
        while(pNode != null){
            ComplexListNode pCloned = pNode.m_pnext;
            if(pNode.m_pSibling != null){
                pCloned.m_pSibling = pNode.m_Sibling.m_pnext;
            }

            pNode = pCloned.m_pnext;
        }
    }
    public static ComplexListNode ReconnectNodes(ComplexListNode pHead){

        ComplexListNode pNode = pHead;
        ComplexListNode pClonedHead = null;
        ComplexListNode pClonedNode = null;

        if(pNode != null){
            pClonedHead = pClonedNode = pNode.m_pnext;
            pNode.m_pnext = pClonedNode.m_pnext;
            pNode = pNode.m_pnext;
        }

        while(pNode != null){
            pClonedNode.m_next = pNode.m_next;
            pClonedNode = pClonedNode.m_pnext;
            pNode.m_pnext = pClonedNode.m_pnext;
            pNode = pNode.m_pnext;
        }

        return pClonedHead;
    }
}




公開された118元の記事 ウォン称賛35 ビュー120 000 +

おすすめ

転載: blog.csdn.net/abc7845129630/article/details/52729390