タイトル:複素関数ComplexListNodeのコピーリストを実装します。複合リンクされたリストは、各ノードが次のノードへのポインタにm_pNext加算を有し、リンクされたリストまたはNULL内の任意のノードをm_pSibling点があります。
以下は含んで5 リスト・ノードの複合型の。実線矢印が示すm_pNext ポインタ破線矢印m_pSibling ポインタ。簡単にするために、ポイントのNULL ポインタが示されていません。
最初のステップは、元のリスト上の各リストをコピーすることであり、で:問題を参照してください、私の最初の反応は、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;
}
}