双项链表的使用

介绍

  • 双向链表是一种链表数据结构,每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。这种结构使得双向链表可以从任意一个节点开始向前或向后遍历。

案例

java 复制代码
class DoublyListNode {
    int val; // 当前节点的值
    DoublyListNode prev; // 指向前一个节点的指针
    DoublyListNode next; // 指向后一个节点的指针

    DoublyListNode(int val) {
        this.val = val;
        this.prev = null;
        this.next = null;
    }
}

public class DoublyLinkedList {
    private DoublyListNode head; // 头节点
    private DoublyListNode tail; // 尾节点

    // 添加元素到双向链表的头部
    public void addToFront(int val) {
        DoublyListNode newNode = new DoublyListNode(val);
        if (head == null) { // 如果链表为空
            head = newNode;
            tail = newNode;
        } else {
            newNode.next = head; // 新节点的下一个节点指向当前头节点
            head.prev = newNode; // 当前头节点的前一个节点指向新节点
            head = newNode; // 更新头节点
        }
    }

    // 添加元素到双向链表的尾部
    public void addToBack(int val) {
        DoublyListNode newNode = new DoublyListNode(val);
        if (tail == null) { // 如果链表为空
            head = newNode;
            tail = newNode;
        } else {
            newNode.prev = tail; // 新节点的前一个节点指向当前尾节点
            tail.next = newNode; // 当前尾节点的下一个节点指向新节点
            tail = newNode; // 更新尾节点
        }
    }

    // 从双向链表中删除指定元素
    public void delete(int val) {
        DoublyListNode current = head;
        while (current != null) {
            if (current.val == val) {
                if (current == head) { // 如果要删除的节点是头节点
                    head = head.next; // 更新头节点
                    if (head != null) head.prev = null; // 如果头节点存在,将其前一个节点置为null
                } else if (current == tail) { // 如果要删除的节点是尾节点
                    tail = tail.prev; // 更新尾节点
                    if (tail != null) tail.next = null; // 如果尾节点存在,将其下一个节点置为null
                } else { // 如果要删除的节点在链表中间
                    current.prev.next = current.next; // 将当前节点的前一个节点的下一个节点指向当前节点的下一个节点
                    current.next.prev = current.prev; // 将当前节点的下一个节点的前一个节点指向当前节点的前一个节点
                }
                return; // 删除完成,退出循环
            }
            current = current.next; // 继续遍历下一个节点
        }
    }

    // 反转双向链表
    public void reverse() {
        DoublyListNode temp = null;
        DoublyListNode current = head;

        // 交换每个节点的prev和next指针
        while (current != null) {
            temp = current.prev; // 临时保存当前节点的前一个节点
            current.prev = current.next; // 当前节点的prev指针指向当前节点的next节点
            current.next = temp; // 当前节点的next指针指向当前节点的前一个节点
            current = current.prev; // 当前节点向前移动
        }

        // 更新头部和尾部节点
        if (temp != null) {
            head = temp.prev; // 更新头节点
            tail = current; // 更新尾节点,此时current为null
        }
    }

    // 从头到尾遍历双向链表
    public void traverseForward() {
        DoublyListNode current = head;
        while (current != null) {
            System.out.print(current.val + " "); // 输出当前节点的值
            current = current.next; // 继续遍历下一个节点
        }
        System.out.println(); // 输出换行,用于美观
    }

    // 从尾到头遍历双向链表
    public void traverseBackward() {
        DoublyListNode current = tail;
        while (current != null) {
            System.out.print(current.val + " "); // 输出当前节点的值
            current = current.prev; // 继续遍历前一个节点
        }
        System.out.println(); // 输出换行,用于美观
    }
}
相关推荐
A懿轩A23 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
️南城丶北离1 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
✿ ༺ ོIT技术༻1 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
菜鸡中的奋斗鸡→挣扎鸡9 小时前
滑动窗口 + 算法复习
数据结构·算法
axxy200010 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
Uu_05kkq11 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
1nullptr13 小时前
三次翻转实现数组元素的旋转
数据结构
TT哇13 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
A懿轩A13 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J15 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法