SplDoublyLinkedList 类

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

简介

SplDoublyLinkedList 类提供了双向链表的主要功能。

类概要

class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable {
/* 常量 */
public const int IT_MODE_LIFO;
public const int IT_MODE_FIFO;
public const int IT_MODE_DELETE;
public const int IT_MODE_KEEP;
/* 方法 */
public add(int $index, mixed $value): void
public bottom(): mixed
public count(): int
public current(): mixed
public isEmpty(): bool
public key(): int
public next(): void
public offsetExists(int $index): bool
public offsetGet(int $index): mixed
public offsetSet(?int $index, mixed $value): void
public offsetUnset(int $index): void
public pop(): mixed
public prev(): void
public push(mixed $value): void
public rewind(): void
public serialize(): string
public setIteratorMode(int $mode): int
public shift(): mixed
public top(): mixed
public unserialize(string $data): void
public unshift(mixed $value): void
public valid(): bool
}

预定义常量

迭代方向

SplDoublyLinkedList::IT_MODE_LIFO

列表将以后进先出顺序迭代,就像堆栈一样。

SplDoublyLinkedList::IT_MODE_FIFO

列表将以先进先出顺序迭代,就像队列一样。

迭代行为

SplDoublyLinkedList::IT_MODE_DELETE

迭代将删除已迭代的元素。

SplDoublyLinkedList::IT_MODE_KEEP

迭代不会删除已迭代的元素。

目录

添加注释

用户贡献的注释 6 个注释

63
Gilles A
11 年前
SplDoublyLinkedList 中的 FIFO 和 LIFO

$list = new SplDoublyLinkedList();
$list->push('a');
$list->push('b');
$list->push('c');
$list->push('d');

echo "FIFO (先进先出) :\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
echo $list->current()."\n";
}

结果

// FIFO (先进先出)
// a
// b
// c
// d

echo "LIFO (后进先出) :\n";
$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for ($list->rewind(); $list->valid(); $list->next()) {
echo $list->current()."\n";
}

结果

// LIFO (后进先出)
// d
// c
// b
// a
38
Maaz Rehman
9 年前
/*
php 双向链表是一个很棒的数据结构,双向意味着您可以向前和向后遍历,如果需要,它可以充当双端队列 (双端队列),
以下是如何工作的

*/

// 实例化一个双向链表对象

$dlist=new SplDoublyLinkedList();

// push 将数据插入列表的末尾
$dlist->push('hiramariam');
$dlist->push('maaz');
$dlist->push('zafar');

/* 列表包含
hiramariam
maaz
zafar
*/

// unshift 将对象插入列表的顶部
$dlist->unshift(1);
$dlist->unshift(2);
$dlist->unshift(3);

/* 列表现在包含
3
2
1
hiramariam
maaz
zafar
*/

// 您可以使用 pop 从列表底部删除一项
$dlist->pop();

/* 列表现在包含
3
2
1
hiramariam
maaz

*/
// 您可以使用 shift() 从列表顶部删除一项
$dlist->shift();

/* 列表现在包含

2
1
hiramariam
maaz

*/

/* 如果您想替换特定索引处的项目,您可以使用名为 add 的方法,请注意,如果您想替换不存在的项目,将引发异常 */

$dlist->add(3 , 2.24);

/*
要遍历列表,我们使用一个简单的 for 循环,下面显示的 rewind() 方法根据迭代器指向列表的初始位置,valid() 方法检查列表是否仍然有效,这意味着它确保循环在到达列表中的最后一个数据后不会一直进行,next() 方法简单地指向列表中的下一个数据。

*/
for($dlist->rewind();$dlist->valid();$dlist->next()){

echo $dlist->current()."<br/>";
}
echo "<br/>";
/*

要向后遍历

*/
$dlist->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
for($dlist->rewind();$dlist->valid();$dlist->next()){

echo $dlist->current()."<br/>";;
}
7
dongchao769390531 at 163 dot com
7 年前
<?php
$splDoubleLinkedList
= new SplDoublyLinkedList();
$splDoubleLinkedList->push('a');
$splDoubleLinkedList->push('3');
$splDoubleLinkedList->push('v');
$splDoubleLinkedList->push('1');
$splDoubleLinkedList->push('p');
// 首先,我们需要倒带列表
$splDoubleLinkedList->rewind();
// 使用 while,检查列表是否有有效节点
while ($splDoubleLinkedList->valid()){
// 打印当前节点的值
echo $splDoubleLinkedList->current()."\n";
// 将光标转到下一个节点
$splDoubleLinkedList->next();
}
?>
1
77931774 at qq dot com
2 年前
$list = new SplDoublyLinkedList();

for ($i = 0; $i < 2000001; $i++) {
$list->push($i);
}

$s = microtime(true);

//$res = $list->offsetGet(2000000); // 耗时 7 毫秒
$res = $list->offsetGet(0); // 耗时 0.07 毫秒
var_dump($res);

$e = microtime(true);

echo ($e - $s) * 1000;
0
Premysl Karbula
1 年前
一个用指定数组中的项目替换双向链表 (DLL) 部分的函数。

<?php

/**
* 用指定替换数组中的项目替换 DLL 的部分 (由索引和长度指定)。
*/
public function dll_splice(
\SplDoublyLinkedList $dll,
int $start,
int $length,
array
$replacement,
):
void {

if (
$start < 0 || ($start + $length) > $dll->count()) {
throw new
\OutOfRangeException("Invalid range for splicing");
}

for (
$i = 0; $i < $length; $i++) {
$dll->offsetUnset($start);
}

foreach (
$replacement as $item) {
$dll->add($start, $item);
}

}

?>
-2
lincoln dot du dot j at gmail dot com
7 年前
$a = new SplDoublyLinkedList;
$arr=[1,2,3,4,5,6,7,8,9];
for($i=0;$i<count($arr);$i++){
$a->add($i,$arr[$i]);
}

$a->push(11); // push 方法
$a->add(10,12); // add 方法必须带索引
$a->shift(); // 删除数组第一个值
$a->unshift(1); // 添加第一个值

$a->rewind(); // 从第一个开始

echo "SplDoublyLinkedList 数组最后一个/顶部值 " . $a->top() ." \n";
echo "SplDoublyLinkedList 数组计数值 " . $a->count() ." \n";
echo "SplDoublyLinkedList 数组第一个/底部值 " . $a->bottom() . " \n\n";

while($a->valid()){ // 使用 valid 方法检查
echo '键 ', $a->key(), ' 值 ', $a->current(),"\n"; // 在这里使用 key 和 current 方法
$a->next(); // 在这里使用 next 方法
}

$a->pop(); // 删除数组最后一个值
print_r($a);
$s=$a->serialize();
echo $s;

// 输出
SplDoublyLinkedList 数组最后一个/顶部值 12
SplDoublyLinkedList 数组计数值 11
SplDoublyLinkedList 数组第一个/底部值 1

键 0 值 1
键 1 值 2
键 2 值 3
键 3 值 4
键 4 值 5
键 5 值 6
键 6 值 7
键 7 值 8
键 8 值 9
键 9 值 11
键 10 值 12
SplDoublyLinkedList 对象
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => 数组
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 11
)

)
i:0;:i:1;:i:2;:i:3;:i:4;:i:5;:i:6;:i:7;:i:8;:i:9;:i:11;
To Top