/**
* 链表元素结点类
*/
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. jdk各种包安装方式

    大家都知道,现在JAVA的发展可谓是如日中天,它覆盖面非常广泛,小到个人PC,大到商业应用都能见到它的身影.以前它是由SUN公司来维护的,现在已经归属到甲骨文旗下了. 今天我们来学习一下Java JD ...

  2. js权威指南笔记

    //如setTimeout的delay参数为0毫秒,那么指定的函数不会立即执行.只会把它放到队列中,等到前面处于等待状态的事件处理 //程序全部执行完成后,再调用它. function invoke( ...

  3. hdu1003 Max Sum(最大子串)

    https://vjudge.net/problem/HDU-1003 注意考虑如果全为负的情况,特判. 还有输出格式,最后一个输出不用再空行. #include<iostream> #i ...

  4. Redis的快照持久化-RDB与AOF

    Redis持久化功能 Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边. 数据保存到硬盘的过程就称为“持久化 ...

  5. YUV420序列转成图片

    首先声明一点,这里的YUV其实不是YUV,严格来说是YCbCr.这里就先这样称呼YUV吧.本文是关于YUV420格式的视频转成图片序列的. 关于YUV格式的图片,存储如下图所示: 举个例子,一个640 ...

  6. ConditionalOnProperty

    配置Spring Boot通过@ConditionalOnProperty来控制Configuration是否生效 1.matchIfMissing属性:从application.properties ...

  7. linux内核剖析(八)进程间通信之-管道

    管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...

  8. Linux基础知识之用户和用户组以及 Linux 权限管理

    已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看 ...

  9. Protobuf3 序列化

    在message_lite.h中定义了SerializeToString ,SerializeToArray ,SerializeToCodedStream ,SerializeToZeroCopyS ...

  10. [C++]“error C2712: 无法在要求对象展开的函数中使用__try”解决方案

    https://blog.csdn.net/shiqw5696/article/details/80664749 前段时间写了一篇关于C++异常捕获及异常处理的文章:c++异常捕获及异常处理try-t ...