[PHP] 算法-复制复杂链表的PHP实现
复杂链表的复制:
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实现的更多相关文章
- Leetcode算法系列(链表)之删除链表倒数第N个节点
Leetcode算法系列(链表)之删除链表倒数第N个节点 难度:中等给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点.示例:给定一个链表: 1->2->3->4-&g ...
- Leetcode算法系列(链表)之两数相加
Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素 ...
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
- 剑指Offer 25. 复杂链表的复制 (链表)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- 剑指offer-字符的所有组合,复制复杂链表,二叉树中和为某一值的路径
字符的所有组合 描述: 输入一个字符串,求这个字符串中的字符的所有组合.如:"abc",组合为"a" "b" c" "a ...
- 数据结构与算法(c++)——反转链表
算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐 ...
- bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)
[题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...
- C:数据结构与算法之单链表
单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结 ...
随机推荐
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十六之铭文升级版
铭文一级: linux crontab 网站:http://tool.lu/crontab 每一分钟执行一次的crontab表达式: */1 * * * * crontab -e */1 * * * ...
- 可遇不可求的Question之MySQL系统变量interactive_timeout 与 wait_timeout 篇
mysql>show variables like '%timeout'; 打印结果如下: +----------------------------+-------+ | Variable_n ...
- WebService接口定义及调用
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. WebS ...
- 设计模式,Let's “Go”! (上)
code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...
- 美团2018年CodeM大赛-初赛B轮 C题低位值
试题链接:https://www.nowcoder.com/acm/contest/151/C 定义lowbit(x) =x&(-x),即2^(p-1) (其中p为x的二进制表示中,从右向左数 ...
- HttpRunner Manager接口自动化测试平台实践(Windows)
1. 源码下载 github: https://github.com/HttpRunner/HttpRunnerManager 下载后放入项目目录,结构如下: 2.依赖环境 根据根目录require ...
- MySQL数值类型
MySQL数值类型 MySQL支持所有标准的SQL数值数据类型.这些类型包括数值数据类型INTEGER.SMALLINT.DECIMAL.NUMERIC和近似数值数据类型FLOAT.REAL.DOUB ...
- vue 自学笔记(三) 计算属性与侦听器
一:计算属性 虽然在模板内使用表达式对属性进行处理十分便利,例如在小胡子语法里写number + 1实现对数据的简单处理,但若我们在其中加入大量的代码,使得逻辑变重,导致难以维护.例如下面的代码,并不 ...
- Neo4j使用Cypher查询图形数据
Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言 ...
- 今天讲座的感悟--java
发现当你擅长于某一专业,永远那专业上的人才挤挤.倘若你和相邻专业结合,就能更厉害的走在交叉专业上.例如:医学加计算机等 待续...