はじめに:
質問のリスト、ポインタが間違っていることは容易ではない、良い区別しなければなりません。
タイトル説明
複合入力リスト(各ノードは、ノードの値を有し、二つのポインタ、次のノードへの1つのポインティング、他のノードへの特別なポインタ)は、複雑なリストの複製の頭部後の値を返します。(出力結果は、パラメータノード参照を返さないことに注意、それ以外のプログラムは、直接、空の宣告質問に戻ります)
問題解決のためのアイデア
質問は、解決する方法を考えていない長い時間のためだと思います。最後に、古い地図記憶ノードと新しいノード間のマッピングを使用して直接再生直接使用。ノードがすでに存在する場合は、新しいストレージノードとそれらの間のマッピングを開くために以下の必要がある場合は、その後、既存のノードを使用することができます。
サンプルコード
package com.asong.leetcode.CloneList;
import java.util.HashMap;
/**
* 复杂链表的复制
* 思路:使用map来存储映射关系。
*/
public class Solution1 {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead == null)
{
return null;
}
RandomListNode newHead = null;
RandomListNode pPre = pHead;
RandomListNode pClone = null;
HashMap<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
while(pPre!=null)
{
if(newHead == null)
{
newHead = new RandomListNode(pPre.label);
pClone = newHead;
map.put(pHead,newHead);//保存映射关系
}else {
//先保存下一结点的值
if (pPre.next!=null && map.containsKey(pPre.next))
{
pClone.next = map.get(pPre.next);
}else {
if(pPre.next!=null)
{
RandomListNode temp = new RandomListNode(pPre.next.label);
map.put(pPre.next,temp);
pClone.next = temp;
}
}
if(pPre.random!=null && map.containsKey(pPre.random))
{
pClone.random = map.get(pPre.random);
}else {
if(pPre.random!=null)
{
RandomListNode temp = new RandomListNode(pPre.random.label);
map.put(pPre.random,temp);
pClone.random = temp;
}
}
pPre = pPre.next;
pClone = pClone.next;
}
}
return newHead;
}
}