复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)


普通链表的赋值非常简单,一个while循环一路next直到指针为空,复杂链表因为有random指针的存在一次访问难以实现共random指针的赋值,所以先根据next指针得到完整的链表,然后从新的链表头部开始逐个根据原始链表中random节点的值,寻找在新的链表中的节点,然后由random节点指向它就可以了。

class RandomListNode{
    var $label;
    var $next = NULL;
    var $random = NULL;
    function __construct($x){
        $this->label = $x;
    }
}
function MyClone($pHead)
{
    if($pHead==null){
        return $pHead;
    }
     $pHead1 = $pHead;
    //新的链表头部
    $new_head = new RandomListNode($pHead1->label);
    $p_new_head = $new_head;
    $pHead1 = $pHead1->next;
    $node_array = array($phead->random);
    while($pHead1!=null){ //根据next访问完整的链表,然后把节点存在数组里面
        $temp = new RandomListNode($pHead1->label);
        $node_array[] = $temp->label;
        $p_new_head->next = $temp;
        $p_new_head = $p_new_head->next;
        $pHead1 = $pHead1->next;
    }
    //给random指针赋值
    $p_newHead2 = $new_head;
    $p_Head2 = $pHead;
    $i= 0;
    while($p_Head2!=null){
        $random = $p_Head2->random;
        if($random!=null){
            $tem_new_head = $new_head;
            while($tem_new_head->label!=$random->label){
                $tem_new_head = $tem_new_head->next;
            }
        }
        else{
            $tem_new_head = null;
        }
        $p_newHead2->random = $tem_new_head;
        $p_newHead2 = $p_newHead2->next;
        $p_Head2 = $p_Head2->next;
    }
    return $new_head;
   
}

你可能感兴趣的:(复杂链表的复制)