复杂链表的复制:
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. android-基础编程-ScrollView

    滚动视图(ScrollView)是指当拥有很多内容,屏幕显示不完时,需要通过滚动来显示完整的视图.包括水平滚动视图(HorizontalScrollView)和垂直滚动视图(ScrollView) 基 ...

  2. _ZNote_Qt_Tips_添加动态链接库

    之前添加都是 手写添加,今天陈老师提示可以在 .pro 文件内空白处,右键弹出添加

  3. Latex 自定义命令:用于一些特殊单词的显示

    \usepackage{xspace} \newcommand{\ie}{{\emph{i.e.}},\xspace} \newcommand{\viz}{{\emph{viz.}},\xspace} ...

  4. Linux Ubuntu部署web环境及项目tomcat+jdk+mysql

    1,下载文件 在官网下载好 tomcat.jdk.mysql的linux压缩包 后缀名为.tar.gz 并通过xftp上传到服务器 或者直接通过linux命令 下在wget文件的下载地址 例如: wg ...

  5. asp.net对接拼多多

    asp.net对接拼多多视频地址:https://www.bilibili.com/video/av43512047/?p=7

  6. SVN 客户端 TortoiseSVN 的安装和使用

    关于 参考博客:TortoiseSVN新人使用指南 TortoiseSVN 是一个 Apache Subversion(SVN)客户端,实现为Windows外壳扩展.它直观且易于使用,因为它不需要Su ...

  7. web API简介(三):客户端储存之Web Storage API

    概述 前篇:web API简介(二):客户端储存之document.cookie API 客户端储存从某一方面来说和动态网站差不多.动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据. W ...

  8. rabbitmq基础学习+springboot结合rabbitmq实现回调确认confirm

    rabbitmq集群docker快速搭建 https://blog.csdn.net/u011058700/article/details/78708767 rabbitmq原理博客 https:// ...

  9. Xamarin.Android 调用手机拍照功能

    最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-- ...

  10. asp.net mvc开发过程中的一些小细节

    现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...