/**
* 链表元素结点类
*/
class Node {
public $pre = NULL; // 前驱
public $next = NULL; // 后继
public $data = NULL; // 结点值
public function __Construct($data) {
$this->data = $data;
}
} /**
* 双向链表类
*/
class DoubleLink {
private $head; // 头指针
private $tail; // 尾指针
private $len; // 链表长度 /**
* 初始化链表
*/
public function __Construct()
{
$newNode = $newNode = new Node(null);
$this->tail = $this->head = $newNode;
$this->len = 0;
} /**
* 添加结点
* @param $data 要添加的结点
* @param $search 添加的位置
*/
public function addNode($data, $search = null) {
$newNode = new Node($data);
$tmp = $this->searchNode($search);
if ($tmp !== null) {
$newNode->pre = $tmp->pre;
$newNode->next = $tmp;
$tmp->pre = $newNode;
$newNode->pre->next = $newNode;
} else {
$newNode->pre = $this->tail;
$this->tail->next = $newNode;
$this->tail = $newNode;
}
$this->len++;
} /**
* 删除指定结点
* @param $search
*/
public function delNode($search) {
$tmp = $this->searchNode($search);
if(null !== $tmp){
if ($tmp->next !== null) {
$tmp->pre->next = $tmp->next;
$tmp->next->pre = $tmp->pre;
} else {
$tmp->pre->next = null;
}
unset($tmp);
$this->len--;
}
} /**
* 修改指定结点的值
* @param $search
* @param $data
*/
public function setNode($search, $data){
$tmp = $this->searchNode($search);
if(null !== $tmp){
$tmp->data = $data;
}
} /**
* 查找结点
* @param $search 要查找的结点元素值
* @return $tmp 查找到的结点元素
*/
public function searchNode($search) {
$tmp = $this->head;
while ( $tmp->next !== null ) {
$tmp = $tmp->next;
if ($tmp->data === $search) {
return $tmp;
}
}
return null;
} /**
* 读取链表全部结点
*/
public function show() {
$tmp = $this->head;
while ( $tmp->next !== null ) {
$tmp = $tmp->next;
echo $tmp->data;
}
echo "<br/>";
$tmp = $this->tail;
while ( $tmp->pre !== null ) {
echo $tmp->data;
$tmp = $tmp->pre;
}
}
} $myList = new DoubleLink();
$myList->addNode("A");
$myList->addNode("B");
$myList->addNode("C");
$myList->addNode("D");
$myList->addNode("E");
$myList->addNode('F','C');
$myList->delNode('F');
$myList->setNode("B",'G');
$myList->show();

php 实现双向链表的更多相关文章

  1. 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  2. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  3. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

  4. Linux 内核数据结构:Linux 双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  5. Linux 内核数据结构:双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  6. 线性表-双向链表(LinkedList)

    双向链表:如图1-3 所示,会把当前header拆分开,重新插入一个Entry<E>. LinkedList源码 0.首先这个类中的两个变量 private transient Entry ...

  7. Shuffling Machine和双向链表

    1. 双向链表 https://github.com/BodhiXing/Data_Structure 2. Shuffling Machine https://pta.patest.cn/pta/t ...

  8. MS - 1 - 把二元查找树转变成排序的双向链表

    ## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10       ...

  9. javascript中的链表结构—双向链表

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...

  10. Java自己实现双向链表LinkList

    /** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com& ...

随机推荐

  1. 关于 extern "C"的说明

    在用C++的项目源码中,经常会不可避免的会看到下面的代码 #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplus ...

  2. 【搜索】WAR大佬的SET @upcexam6201

    时间限制: 1 Sec 内存限制: 128 MB 题目描述 WAR大佬认为一个包含重复元素的集合认为是优美的,当且仅当集合中的元素的和等于他们的积. 求包含n个元素的优美的集合的个数. WAR大佬当然 ...

  3. hihocoder1712 字符串排序(思维)

    https://hihocoder.com/problemset/problem/1712 感觉解法呼之欲出,却出不来.. 一个很好的思路是,根据新的顺序表,把给定的n组字符串换成旧表对应的字符,然后 ...

  4. JavaScript字符串API

    String.prototype.anchor() anchor()方法用于创建一个<a>html描元素 const str = '我是html内容'.anchor('我是name属性值' ...

  5. mysql 正则表达式判断是否数字

    select ('123a' REGEXP '[^0-9.]'); --‘123a'中含有字符'a' 输出结果为1 mysql中常量true输出为1 false输出为0

  6. 如何禁用package-lock

    因为 package-lock.json是自动生成的,可以配置 npm 来避免经常需要手动删除这个文件. 在当前项目禁用 package-lock.json 控制台下输入 echo 'package- ...

  7. 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

    由于是开发阶段,所以并没有配置postgres的参数,都是使用安装时的默认配置,以前运行也不见得有什么不正常,可是前几天我的cpu资源占用突然升高.查看进程,发现有一个postgres的进程占用CPU ...

  8. Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

  9. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

  10. Atitit 关于共享经济之共享男女朋友的创业计划

    Atitit 关于共享经济之共享男女朋友的创业计划 1. 共享经济的历史与趋势 1 1.1. 共享经济三大特征=产能过剩+共享平台+人人参与. 1 1.2. 共享经济是个大趋势,使用权渐渐的取代所有权 ...