PHP SPL双向链表的疑惑

<?php
/**
*SplDoublyLinkedList 类学习
*/
$obj = new SplDoublyLinkedList();
$obj -> push(1);//把新的节点添加到链表的顶部top
$obj -> push(2);
$obj -> push(3);
$obj -> unshift(10);//把新节点添加到链表底部bottom
print_r($obj);
$obj ->rewind();//rewind操作用于把节点指针指向Bottom所在节点

$obj -> prev();//使指针指向上一个节点,靠近Bottom方向
echo 'next node :'.$obj->current().PHP_EOL;
$obj -> next();
$obj -> next();//为什么没有值
echo 'next node :'.$obj->current().PHP_EOL;

$obj -> next();//为什么没有值### 问题描述
阅读 2k
3 个回答

10在第0位,prev()以后指向一个空节点,指针不可用,就结束了。指针不可用自然不存在next()。不存在next,你再怎么调用next()方法,指针不会自动指向下一个了。
valid()就是用来判断指针是否可用

这有啥好疑惑的。

最后链表的结构是 3 ←→ 2 ←→ 1 ←→ 10

最开始 rewind10 了;然后 prev 移动到 1;然后 next 移动到 10;到头了,再然后两次 next 当然没值了。

我估计你是对双向链表望文生义了,双向指的是一个节点除了存自身外、还存了两个方向的节点指针,所以叫双向;不是链表的首尾连一块儿了。只存左或右节点的就是单链表。


补充回答:

抱歉,链表顺序看反了。其他两位的答案是对的。

你的疑惑是正常的,因为在顶部进行了一次prev,导致节点索引越界,变成-1,后期再进行next已经无法取得正确的索引,一直是-1。所以打印出来都是空的。
这个在文档中好像没写。
不过没关系,判断一下是否越界然后重新rewind一次即可。

推荐问题