当前位置:首页 > PHP

php实现双向链表

2026-02-15 16:40:56PHP

双向链表的基本概念

双向链表是一种线性数据结构,每个节点包含两个指针:一个指向前驱节点(prev),一个指向后继节点(next)。与单向链表相比,双向链表支持双向遍历,但需要更多内存存储指针。

php实现双向链表

PHP实现双向链表的步骤

定义节点类

创建一个Node类表示链表节点,包含数据属性(data)和前后指针(prevnext):

php实现双向链表

class Node {
    public $data;
    public $prev;
    public $next;

    public function __construct($data) {
        $this->data = $data;
        $this->prev = null;
        $this->next = null;
    }
}

定义双向链表类

实现双向链表的常用操作(插入、删除、遍历等):

class DoublyLinkedList {
    private $head;
    private $tail;

    public function __construct() {
        $this->head = null;
        $this->tail = null;
    }

    // 在链表尾部插入节点
    public function append($data) {
        $newNode = new Node($data);
        if ($this->head === null) {
            $this->head = $newNode;
            $this->tail = $newNode;
        } else {
            $newNode->prev = $this->tail;
            $this->tail->next = $newNode;
            $this->tail = $newNode;
        }
    }

    // 在链表头部插入节点
    public function prepend($data) {
        $newNode = new Node($data);
        if ($this->head === null) {
            $this->head = $newNode;
            $this->tail = $newNode;
        } else {
            $newNode->next = $this->head;
            $this->head->prev = $newNode;
            $this->head = $newNode;
        }
    }

    // 删除指定值的节点
    public function delete($data) {
        $current = $this->head;
        while ($current !== null) {
            if ($current->data === $data) {
                if ($current->prev !== null) {
                    $current->prev->next = $current->next;
                } else {
                    $this->head = $current->next;
                }
                if ($current->next !== null) {
                    $current->next->prev = $current->prev;
                } else {
                    $this->tail = $current->prev;
                }
                return true;
            }
            $current = $current->next;
        }
        return false;
    }

    // 正向遍历链表
    public function traverseForward() {
        $current = $this->head;
        while ($current !== null) {
            echo $current->data . " ";
            $current = $current->next;
        }
        echo PHP_EOL;
    }

    // 反向遍历链表
    public function traverseBackward() {
        $current = $this->tail;
        while ($current !== null) {
            echo $current->data . " ";
            $current = $current->prev;
        }
        echo PHP_EOL;
    }
}

使用示例

$dll = new DoublyLinkedList();
$dll->append(10);    // 尾部插入
$dll->append(20);
$dll->prepend(5);    // 头部插入
$dll->traverseForward();  // 输出: 5 10 20
$dll->traverseBackward(); // 输出: 20 10 5
$dll->delete(10);    // 删除节点
$dll->traverseForward();  // 输出: 5 20

关键点说明

  • 头尾指针headtail分别指向链表的首尾节点,简化插入和删除操作。
  • 边界处理:插入或删除节点时需检查是否为头节点或尾节点,避免空指针异常。
  • 时间复杂度
    • 插入/删除头部或尾部节点:O(1)
    • 删除中间节点:O(n)(需遍历查找)。

通过上述实现,可以灵活操作双向链表,适用于需要频繁双向遍历的场景。

标签: 双向链表
分享给朋友:

相关文章

vue实现双向滚动

vue实现双向滚动

实现双向滚动的 Vue 方法 双向滚动通常指两个关联的滚动区域(如表格的头部和内容部分)同步滚动。以下是几种实现方式: 使用事件监听和 scroll 方法 通过监听一个滚动区域的 scrol…

vue双向绑定实现方式

vue双向绑定实现方式

Vue 双向绑定的实现方式 Vue 的双向绑定主要通过 v-model 指令实现,结合数据劫持和发布-订阅模式完成数据与视图的同步更新。以下是核心实现原理及方式: 数据劫持(响应式原理) Vue 使…

vue怎样实现双向绑定

vue怎样实现双向绑定

Vue 双向绑定的实现方式 Vue 主要通过 v-model 指令实现双向绑定,该指令在表单元素或自定义组件上创建双向数据绑定。以下是具体实现方法: 表单元素的双向绑定 在表单输入元素(如 inpu…

vue props实现双向绑定

vue props实现双向绑定

在 Vue 中,props 默认是单向数据流(父组件 → 子组件),但可以通过以下方法实现类似双向绑定的效果: 使用 v-model 语法糖 父组件通过 v-model 传递数据,子组件通过 mod…

react实现双向绑定

react实现双向绑定

React 实现双向绑定的方法 React 本身是单向数据流框架,但可以通过以下方式模拟双向绑定效果: 受控组件方式 通过 value 和 onChange 实现表单元素与状态的同步: funct…

php如何实现链表

php如何实现链表

实现链表的基本结构 在PHP中,链表可以通过类和对象来实现。每个节点是一个对象,包含数据和指向下一个节点的引用。 class ListNode { public $data; pub…