PHP 双链表(SplDoublyLinkedList)简介和使用实例

   这篇文章主要介绍了PHP 双链表(SplDoublyLinkedList)简介和使用实例的相关资料,需要的朋友可以参考下

  双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。


  PHP SPL中的SplDoublyLinkedList类提供了对双链表的操作。

  SplDoublyLinkedList类摘要如下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
 
public __construct ( void )
public void add ( mixed $index , mixed $newval )
//双链表的头部节点
public mixed top ( void )
//双链表的尾部节点
public mixed bottom ( void )
//双联表元素的个数
public int count ( void )
//检测双链表是否为空
public bool isEmpty ( void )
 
 
//当前节点索引
public mixed key ( void )
//移到上条记录
public void prev ( void )
//移到下条记录
public void next ( void )
//当前记录
public mixed current ( void )
//将指针指向迭代开始处
public void rewind ( void )
//检查双链表是否还有节点
public bool valid ( void )
 
//指定index处节点是否存在
public bool offsetExists ( mixed $index )
//获取指定index处节点值
public mixed offsetGet ( mixed $index )
//设置指定index处值
public void offsetSet ( mixed $index , mixed $newval )
//删除指定index处节点
public void offsetUnset ( mixed $index )
 
//从双链表的尾部弹出元素
public mixed pop ( void )
//添加元素到双链表的尾部
public void push ( mixed $value )
 
//序列化存储
public string serialize ( void )
//反序列化
public void unserialize ( string $serialized )
 
//设置迭代模式
public void setIteratorMode ( int $mode )
//获取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)
public int getIteratorMode ( void )
 
//双链表的头部移除元素
public mixed shift ( void )
//双链表的头部添加元素
public void unshift ( mixed $value )
 
}

  使用起来也是简单

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

$list = new SplDoublyLinkedList();
$list->push('a');
$list->push('b');
$list->push('c');
 
$list->unshift('top');
$list->shift();
 
print_r(array(
'pop' => $list->pop(),
'count' => $list->count(),
'isEmpty' => $list->isEmpty(),
'bottom' => $list->bottom(),
'top' => $list->top()
));
 
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
print_r($list->getIteratorMode());
 
for($list->rewind(); $list->valid(); $list->next()) {
echo $list->current().PHP_EOL;
}
 
print_r($a = $list->serialize());
//print_r($list->unserialize($a));
 
$list->offsetSet(0,'new one');
$list->offsetUnset(0);
print_r(array(
'offsetExists' => $list->offsetExists(4),
'offsetGet' => $list->offsetGet(0),
 
));
print_r($list);

时间: 2024-10-02 15:51:32

PHP 双链表(SplDoublyLinkedList)简介和使用实例的相关文章

PHP 双链表(SplDoublyLinkedList)简介和使用实例_php实例

双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址. PHP SPL中的SplDoublyLinkedList类提供了对双链表的操作. SplDoublyLinkedList类摘要如下: SplDoublyLinkedList implements Iterator , ArrayAccess , Countable { public __construct ( void ) public void add ( mixed $index ,

javascript数据结构之双链表插入排序实例详解_javascript技巧

本文实例讲述了javascript数据结构之双链表插入排序实现方法.分享给大家供大家参考,具体如下: 数组存储前提下,插入排序算法,在最坏情况下,前面的元素需要不断向后移,以便在插入点留出空位,让目标元素插入. 换成链表时,显然无需做这种大量移动,根据每个节点的前驱节点"指针",向前找到插入点后,直接把目标值从原链表上摘下,然后在插入点把链表断成二截,然后跟目标点重新接起来即可. <!doctype html> <html> <head> <t

PHP单链表的实现代码_php实例

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 单链表简介 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 关键代码如下所示: <?php /** * 单链表 */ class Demo { private $id; public $name; public $next; public function __construct ($id = ''

循环双链表初始化的问题

问题描述 循环双链表初始化的问题 s=(LinkList)malloc(sizeof(Node)); s->data=a[i]; s->next=L->next; if(L->next!=NULL) L->next->prior=s; L->next=s; s->prior=L; 在树上有对L->next的判空语句,但是我认为在循环链表中没有NULL节点,所以我想问问这样做是否多余? 解决方案 如果循环链表构建正确,确实没有必要判断. 但为了程序的健壮

数据结构(C#):双链表

双链表每个数据节点都有两个指针,分别指向其后继和前驱节点.与单链表只能访问其后继结点相比 ,具有更大的灵活性:当然占用更多的存储空间. 前面的单链表和这里的双链表都使用了空的头结点或称哑节点,目的是实现有序链表时更方便. 直接看代码: /* * File : DoubleLinkedList.cs * Author : Zhenxing Zhou * Date : 2008-12-06, 2008-12-07 * Blog : http://www.xianfen.net/ */ using S

单双链表:通过指针变动交换相邻元素

<数据结构与算法分析,C语言描述>表,栈和队列部分课后题: 单链表:P为待交换的第一个结点的前驱结点: pTemp = p->next; p-next = pTemp->next; pTemp->next = pTemp->next->next; p->next->next = pTemp; 双链表:P为待交换的第一个结点 p->last->next = p->next; p->next->last = p->las

简单介绍线性表以及如何实现双链表_java

线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 一.数组数组有上界和下界,数组的元素在上下界内是连续的. 存储10,20,30,40,50的数组的示意图如下: 数组的特点:数据是连续的:随机访问速度快. 数组中稍微复杂一点的是多维数组和动态数组.对于C语言而言,多维数组本质上也是通过一维数组实现的.至于动态数组,是指数组的容量能动态增长的数组:对于C语言而言,若要提供动态数组,需要手动实现:而对于C++而言,STL提供了Vector:对于Java而言,Collec

视频-c#链表问题,包括最基础的单链表双链表以及循环链表的使用

问题描述 c#链表问题,包括最基础的单链表双链表以及循环链表的使用 新手,最近在学c#,请问有谁知道关于链表的视频,包括单链表,单循环链表,双循环链表等等,从链表最基础的开始讲的视频,里面介绍使用链表最基础的代码,谢了谢了!

双链表双链表怎么存储对象

问题描述 双链表双链表怎么存储对象 c++的问题,怎么把对象用链表存储起来,试了好多遍,把双链表的头文件的datatype定义为person为什么没有用 解决方案 建议楼主贴一下完整代码 解决方案二: 双链表都有一个next指针.prev指针和data数据存储区,也就是说data存储的就是你的person对象,所以你在创建链表的时候person应该是你链表的一个属性把 解决方案三: 双链表双链表