- 双向链表的优点:对于链表中一个给定的结点,可以从两个方向进行操作;
- 双向链表的缺点:每个结点需要一个额外的指针,因此需要更多的开销,插入和删除时更费时;
双向链表的类型声明
1 | class ListNode |
双向链表的插入
在链表的开头前插入一个新结点
- 将新结点的后继指针更新为指向当前的表头结点,将前驱指针赋值为NULL
- 将表头结点的前驱指针更新为指向新结点,然后将新结点作为表头
在链表的末尾后插入一个新结点
- 遍历到链表的最后,然后插入新结点
- 将新结点的后继指针赋值为NULL,前驱指针指向表尾结点
- 将表尾结点的后继指针更新为指向新结点
在链表的中间插入一个新结点
- 将新结点的后继指针赋值为位置结点的后继结点,前驱指针指向位置结点
- 将位置结点的后继结点的前驱指针赋值为新结点,将位置结点的后继指针赋值为新结点
双向链表的删除
删除双向链表的第一个结点
- 创建一个临时结点,它与表头指向同一个结点
- 修改表头指针,使其指向下一个结点,将表头指针的前驱指针赋值为NULL,然后移除临时结点
删除双向链表的最后一个
- 找到表尾结点的前驱结点
- 遍历链表,同时保存前驱结点的地址。当遍历到表尾时,有两个指针分别是指向表尾结点的指针和指向表尾结点的前驱结点的指针
- 更新表尾结点的前驱结点的后继指针的值为NULL
- 移除表尾结点
删除双向链表中间的一个结点
- 遍历链表时保存前驱结点,一旦找到要删除的结点,更改前驱结点的后继指针使其指向被删除结点的后继结点,更改被删除结点的后继结点的前驱指针指向被删除结点的前驱结点
- 移除被删除的当前结点
完整php代码
1 |
|
运行结果:
1 | ============插入=========== |