逆向行驶!数据结构双向链表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();
    }
}



相关文章
|
5月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
295 3
|
7月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
246 1
|
7月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
758 1
|
11月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
179 5
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
216 6
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
1038 0
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
142 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
136 0

热门文章

最新文章

下一篇
oss云网关配置