(四)Java数据结构之双链表

简介: 其实和单链表差不多,以下代码实现了增删改查:

20201009113957385.png


其实和单链表差不多,以下代码实现了增删改查:

package top.baikunlong.linkedlist;
/**
 * @author baikunlong
 * @date 2020/10/9 10:56
 */
public class DoubleLinkedList {
    public Node2 head = new Node2(0, "头节点");
    /**
     * 在最后添加节点
     *
     * @param node
     */
    public void add(Node2 node) {
        //首先找到最后个节点
        Node2 temp = head;//头节点不能移动,需要临时变量
        while (true) {
            if (temp.next == null) {//如果是最后个则添加
                temp.next = node;
                node.pre = temp;//设置前一个节点
                break;
            } else {
                temp = temp.next;//否则移动到下一个节点
            }
        }
    }
    /**
     * 根据no删除
     *
     * @param no
     */
    public void deleteByNo(int no) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node2 temp = this.head.next;//直接自身移除,不需要像单链表那样依赖前一个节点
        while (true) {
            if (temp == null) {
                System.out.printf("节点为 no=%d 不存在\n", no);
                return;
            }
            if (temp.no == no) {
                temp.pre.next=temp.next;//前一个的next指向temp的next
                //如果删除的是最后一个,next为空,就不能指定pre了
                if(temp.next!=null){
                    temp.next.pre=temp.pre;//后一个的pre指向temp的pre
                }
                return;
            }
            temp = temp.next;
        }
    }
    /**
     * 根据no更新
     *
     * @param node
     */
    public void updateByNo(Node2 node) {
        Node2 temp = this.head.next;
        while (true) {
            if (temp == null) {
                System.out.printf("节点为 no=%d 不存在\n", node.no);
                return;
            } else if (temp.no == node.no) {
                temp.name = node.name;
                return;
            }
            temp = temp.next;
        }
    }
    /**
     * 根据no获取
     *
     * @param no
     * @return
     */
    public Node2 getNodeByNo(int no) {
        Node2 temp = this.head.next;
        while (true) {
            if (temp == null) {
                throw new RuntimeException("节点为 no=" + no + " 不存在");
            } else if (temp.no == no) {
                return temp;
            }
            temp = temp.next;
        }
    }
    /**
     * 打印链表
     */
    public void list() {
        if (head.next == null) System.out.println("链表为空");
        Node2 temp = head.next;
        while (true) {
            if (temp == null) {
                break;
            } else {
                System.out.println(temp.toString());
                temp = temp.next;
            }
        }
    }
    public static void main(String[] args) {
        DoubleLinkedList list = new DoubleLinkedList();
        list.add(new Node2(1,"111"));
        list.add(new Node2(2,"222"));
        Node2 node3 = new Node2(3, "333");
        list.add(node3);
        list.add(new Node2(4,"444"));
        list.list();
        list.deleteByNo(1);
        System.out.println("删除1");
        list.list();
        list.deleteByNo(5);
        System.out.println("删除5");
        list.list();
        node3.name="修改过得333";
        list.updateByNo(node3);
        System.out.println("修改333");
        list.list();
        System.out.println("寻找2:");
        System.out.println(list.getNodeByNo(2));
        System.out.println("寻找22:");
        System.out.println(list.getNodeByNo(22));
    }
}
/**
 * 节点类
 */
class Node2 {
    public int no;
    public String name;
    public Node2 next;
    public Node2 pre;
    public Node2(int no, String name) {
        this.no = no;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }
}


目录
相关文章
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
569 1
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
310 4
|
10月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
485 3
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
1074 1
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
527 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
786 25
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
633 5
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
279 5
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
510 5

热门文章

最新文章