输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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;
}