逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

简介: 逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

文章目录

节点类

链表类

测试类


双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。


节点类


//节点类
class DNode {
    //数据域
    public int id;
    public String name;
    //指针域
    public DNode next; //指向后一个节点
    public DNode pre; //指向前一个节点
    public DNode(int id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Node{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}


链表类


//链表类(管理节点)
class DoubleLinkedList {
    //头节点
    private DNode head = new DNode(0,null);
    //展示链表
    public void list(){
        if (head.next == null){
            System.out.println("链表为空!");
            return;
        }
        DNode temp = head.next;
        while (true){
            if (temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }
    //增(在链表尾部)
    public void add1(DNode newNode){
        //因为头节点不能动,因此要一个辅助变量temp
        DNode temp = head;
        //遍历找到最后
        while (true){
            if (temp.next == null){
                break;
            }
            temp = temp.next;
        }
        //当退出while就意味着找到最后一个节点了
        temp.next = newNode;
        newNode.pre = temp;
    }
    //删(根据id匹配删除)
    public void remove(int id){
        if (head.next == null){
            System.out.println("链表为空!");
            return;
        }
        DNode temp = head.next;
        boolean flag = false; //用来标记是否找到对应id的节点
        while (true){
            if (temp == null){
                break;
            }
            if (temp.id == id){ //找到要删除节点的前一个节点
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.pre.next = temp.next; //该节点前一个节点的next指向该节点后一个节点
            if (temp.next != null){ //只有当删除的节点不是最后一个节点时才需要执行下面,否则空指针异常
                temp.next.pre = temp.pre; //该节点后一个节点的pre指向该节点前一个节点
            }
        }else {
            System.out.println("没有找到要删除的节点,删除失败!");
        }
    }
    //改(根据id匹配要修改的节点)
    public void update(int id,String name){
        if (head.next == null){
            System.out.println("链表为空!");
            return;
        }
        DNode temp = head.next;
        boolean flag = false; //用来标记是否找到对应id的节点
        while (true){
            if (temp == null){
                break;
            }
            if (temp.id == id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = name;
        }else {
            System.out.println("没有找到要修改的节点,修改失败!");
        }
    }
    //查(根据id匹配)
    public DNode show(int id){
        if (head.next == null){
            System.out.println("链表为空!");
            return null;
        }
        DNode temp = head.next;
        boolean flag = false;
        while (true){
            if (temp == null){
                break;
            }
            if (temp.id == id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            return temp;
        }else {
            System.out.println("没有找到要查找的节点,查找失败!");
            return null;
        }
    }
}


测试类


/**
 * @Author: Yeman
 * @Date: 2021-10-15-20:20
 * @Description:
 */
public class DoubleLinkedListTest {
    public static void main(String[] args) {
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        DNode node1 = new DNode(1, "阿兰");
        DNode node2 = new DNode(2, "洛国富");
        DNode node3 = new DNode(3, "艾克森");
        doubleLinkedList.add1(node1);
        doubleLinkedList.add1(node2);
        doubleLinkedList.add1(node3);
        doubleLinkedList.list();
//        doubleLinkedList.remove(3); //删
//        doubleLinkedList.update(3,"张玉宁"); //改
//        System.out.println(doubleLinkedList.show(3)); //查
        doubleLinkedList.list();
    }
}



相关文章
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
53 4
|
8天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
29 5
|
22天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
43 5
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
48 6
|
1月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
1月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
47 0
|
1月前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
56 0
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
175 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
32 1
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
下一篇
DataWorks