复杂链表的复制:
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
}
}
}

[PHP] 算法-复制复杂链表的PHP实现的更多相关文章

  1. Leetcode算法系列(链表)之删除链表倒数第N个节点

    Leetcode算法系列(链表)之删除链表倒数第N个节点 难度:中等给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点.示例:给定一个链表: 1->2->3->4-&g ...

  2. Leetcode算法系列(链表)之两数相加

    Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...

  3. 笔试题&amp;面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素

    设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素 ...

  4. 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

    关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...

  5. 剑指Offer 25. 复杂链表的复制 (链表)

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  6. 剑指offer-字符的所有组合,复制复杂链表,二叉树中和为某一值的路径

    字符的所有组合 描述: 输入一个字符串,求这个字符串中的字符的所有组合.如:"abc",组合为"a" "b" c" "a ...

  7. 数据结构与算法(c++)——反转链表

    算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐 ...

  8. bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)

    [题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...

  9. C:数据结构与算法之单链表

    单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结 ...

随机推荐

  1. PHY过采样问题

    什么频率下进行过采样 ?? 按时程序是LMDS时钟小于100M时会进行过程采样,实际上PHY的文档上也有明确的说明: The minimum operational data rate is 1.0 ...

  2. ·通过wifi_scan学习esp32wifi程序编写

    在ESP32的设计开发中,我们必然会需要使用到wifi或ble功能,今天就讲解下如何将WIFI功能纳入到ESP32中来. 初始化WiFi环境 首先,WiFi子系统的初始化需要由我们自己来自行,当我们写 ...

  3. 《mysql必知必会》学习_第16章_20180807_欢

    第16章:创建高级联结. P106 select concat(RTrim(vend_name),'(',RTrim(vend_country),')') as vend_title from ven ...

  4. wampserver 的默认首页设置

    # wampserver 首页顺序设置 <IfModule dir_module> DirectoryIndex index.php default.php index.html inde ...

  5. Android NDK学习(三):Hello World

    版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/6925810.html 首先编写Jni接口的c文件,此文件命名有些特殊,具体的命名方式可以参考文档来做. # ...

  6. WebRTC学习之 Intel® Collaboration Suite for WebRTC源码流程解读

    年后回来,因为新项目的需求,开始了解WebRTC相关的知识.目前接触的是Intel® Collaboration Suite for WebRTC.刚开始看SDK发现很多概念是我目前不知道的,于是恶补 ...

  7. requsets模块的学习

    requests模块的学习 使用之前 pip install requests 发起get,post,请求获取响应 response = requests.get(url,headers) # 发起g ...

  8. C# 获取Header中的token值

    public CurrentUser currentUser { get { CurrentUser result = new CurrentUser(); //jwt 解密token IJsonSe ...

  9. 机器学习库--dlib

    dlib是什么呢?见面了,总要认识一下吧? dlib其实就是一个跨平台的用C++编写的代码库.这个库的机器学习算法和工具可以用来解决现实世界的很多工程问题. 它在工业界和学术界有着广泛的应用.主要在机 ...

  10. 12-部署EFK插件

    配置和安装 EFK 官方文件目录:cluster/addons/fluentd-elasticsearch $ ls *.yaml es-controller.yaml es-service.yaml ...