双项链表的使用

介绍

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

案例

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(); // 输出换行,用于美观
    }
}
相关推荐
努力写代码的熊大9 分钟前
单链表和双向链表
数据结构·链表
Orlando cron1 小时前
数据结构入门:链表
数据结构·算法·链表
许愿与你永世安宁6 小时前
力扣343 整数拆分
数据结构·算法·leetcode
Heartoxx7 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
杰克尼8 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
学不动CV了17 小时前
数据结构---线性表理解(一)
数据结构
ysa05103017 小时前
数论基础知识和模板
数据结构·c++·笔记·算法
今天背单词了吗98018 小时前
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·数据结构·笔记·算法
气质、小青年!18 小时前
【排序算法】
c语言·数据结构
clock的时钟20 小时前
暑期数据结构第一天
数据结构·算法