複雜鏈表的複製: 1.在舊鏈表中每個結點的後面複製出一個結點,隔代 2.把舊鏈表的隨機指向部分,複製到新添加的結點上 3.把新結點從舊鏈表中拆分出來成新鏈表 1. linklist=head while linklist!=null node=new Node() node->next=linkli... ...
複雜鏈表的複製: 1.在舊鏈表中每個結點的後面複製出一個結點,隔代 2.把舊鏈表的隨機指向部分,複製到新添加的結點上 3.把新結點從舊鏈表中拆分出來成新鏈表 1. linklist=head while linklist!=null node=new Node() node->next=linklist->next linklist->next=node linklist=node->next 2. linklist=head while listlink!=null node=listlink->next listlink->next->random=linklist->random!=null ? listlink->random->next : null listlink=node->next 3. tmp=linklist->next linklist->next=tmp->next linklist=tmp
<?php class Node{ public $data; public $random; public $next; public function __construct($data=""){ $this->data=$data; } } //構造一個複雜鏈表 $linkList=new Node(); $linkList->next=null; $temp=$linkList; $node1=new Node("111"); $temp->next=$node1; $temp=$node1; $node2=new Node("222"); $temp->next=$node2; $temp=$node2; $node3=new Node("333"); $node3->random=$node2; //node3又指向了node2 $temp->next=$node3; $temp=$node3; var_dump($linkList); $cloneList=MyClone($linkList); var_dump($cloneList); //複製複雜鏈表 function MyClone($linkList){ $linkList=$linkList->next; //第一步 $temp=$linkList; while($temp!=null){ $node=new Node($temp->data.'clone'); $node->next=$temp->next;//新結點的next指向當前結點的next $temp->next=$node;//當前結點的next指向新結點 $temp=$node->next;//跳兩級 跳過新複製的這個結點 } //第二步 $temp=$linkList; while($temp!=null){ $node=$temp->next; //當前結點的下一級random指向 當前結點random的下一級 $temp->next->random=$temp->random!=null ? $temp->random->next : null; $temp=$node->next; } //第三步 $newList=$linkList->next;//從第二個結點開始要 $temp=$newList; while($temp->next!=null){ $node=$temp->next;//獲取當前結點的next $temp->next=$node->next;//當前結點的next指向 下一級的next , 這樣就消掉了下一個 $temp=$node;//當前結點後移 } return $newList; }
object(Node)#1 (3) { ["data"]=> string(0) "" ["random"]=> NULL ["next"]=> object(Node)#2 (3) { ["data"]=> string(3) "111" ["random"]=> NULL ["next"]=> object(Node)#3 (3) { ["data"]=> string(3) "222" ["random"]=> NULL ["next"]=> object(Node)#4 (3) { ["data"]=> string(3) "333" ["random"]=> *RECURSION* ["next"]=> NULL } } } } object(Node)#5 (3) { ["data"]=> string(8) "111clone" ["random"]=> NULL ["next"]=> object(Node)#6 (3) { ["data"]=> string(8) "222clone" ["random"]=> NULL ["next"]=> object(Node)#7 (3) { ["data"]=> string(8) "333clone" ["random"]=> *RECURSION* ["next"]=> NULL } } }