双项链表的使用

介绍

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

案例

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(); // 输出换行,用于美观
    }
}
相关推荐
搬砖的小码农_Sky6 小时前
C语言:数组
c语言·数据结构
先鱼鲨生7 小时前
数据结构——栈、队列
数据结构
一念之坤7 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年8 小时前
数据结构 (1)基本概念和术语
数据结构·算法
熬夜学编程的小王8 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
liujjjiyun8 小时前
小R的随机播放顺序
数据结构·c++·算法
Reese_Cool10 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
djk888810 小时前
.net将List<实体1>的数据转到List<实体2>
数据结构·list·.net
搬砖的小码农_Sky11 小时前
C语言:结构体
c语言·数据结构
_OLi_13 小时前
力扣 LeetCode 106. 从中序与后序遍历序列构造二叉树(Day9:二叉树)
数据结构·算法·leetcode