PHP Conference Japan 2024

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

列表将以后进先出 (LIFO) 的顺序进行迭代,就像一个栈。

SplDoublyLinkedList::IT_MODE_FIFO

列表将以先进先出 (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 双向链表是一个很棒的数据结构,双向意味着您可以向前和向后遍历,如果需要,它可以充当双端队列(deque),
以下是它的工作原理

*/

// 实例化双向链表对象

$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
3 年前
$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("无效的拼接范围");
}

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