基于Java实现双向链表

实现双向链表的步骤

1. 定义链表节点类

双向链表的节点类需要有三个属性:

  • data: 保存节点所存放的数据。
  • prev: 保存上一个节点的引用。
  • next: 保存下一个节点的引用。

以下是这个节点类的简单实现:

public class Node {
    public int data;
    public Node prev;
    public Node next;

    public Node(int data) {
        this.data = data;
    }
}

2. 实现双向链表类

2.1 定义头节点

你需要实现一个DoubleLinkedList的类。这个类应该有一个头节点head,头节点的下一个节点指向链表的第一个节点。

public class DoubleLinkedList {
    private Node head;

    public DoubleLinkedList() {
        this.head = new Node(0);
        this.head.prev = null;
        this.head.next = null;
    }
}

2.2 遍历整个链表

你可以使用一个辅助节点来遍历双向链表。你可以从头节点开始,直到遇到链表的末尾节点。

public void display() {
    Node node = head.next;
    while (node != null) {
        System.out.print(node.data + " ");
        node = node.next;
    }
}

2.3 在链表末尾添加节点

双向链表的末尾的next应该指向新的节点,新的节点的prev应该指向双向链表的末尾节点。

public void add(int data) {
    Node node = new Node(data);
    Node lastNode = this.getLastNode();
    lastNode.next = node;
    node.prev = lastNode;
}

2.4 在指定位置插入节点

你需要一个辅助节点来遍历你需要插入的位置。新节点的prev应该指向遍历到的节点的prev,新节点的next应该指向遍历到的节点,遍历到的节点的prev应该指向新节点。

public void add(int index, int data) {
    Node node = new Node(data);
    Node curr = head.next;

    for (int i = 0; i < index - 1 && curr != null; i++) {
        curr = curr.next;
    }

    if (curr != null) {
        node.next = curr;
        node.prev = curr.prev;
        curr.prev.next = node;
        curr.prev = node;
    }
}

2.5 删除指定节点

这个操作的实现较为简单。你需要找到需要删除的节点,把前后节点的nextprev相连即可。

public void remove(int data) {
    Node curr = head.next;
    while (curr != null) {
        if (curr.data == data) {
            curr.prev.next = curr.next;
            if (curr.next != null) {
                curr.next.prev = curr.prev;
            }
            break;
        }
        curr = curr.next;
    }
}

3. 测试双向链表实现类

你可以定义一个main函数来测试你的代码。以下是一个简单的测试用例:

public static void main(String[] args) {
    DoubleLinkedList list = new DoubleLinkedList();

    // 在链表末尾添加节点
    list.add(1);
    list.add(2);
    list.add(3);

    // 在指定位置插入节点
    list.add(2, 5);

    // 删除节点
    list.remove(3);

    // 遍历链表并输出节点的值
    list.display();
}

这个测试用例的输出结果为:1 2 5

4. 示例说明

示例1

下面是执行代码list.add(1); list.add(2); list.add(3); list.add(4); list.add(5);后,双向链表的结构示意图:

head ↀ─────→ 1 ←─────〉 2 ←─────〉 3 ←─────〉 4 ←─────〉 5 ←─────ↀ null
                  prev  next  prev  next  prev  next  prev  next  prev  next 

示例2

下面是执行代码list.add(2, 6);后,双向链表的结构示意图:

head ↀ─────→ 1 ←─────〉 2 ←─────〉 6 ←─────〉 3 ←─────〉 4 ←─────〉 5 ←─────ↀ null
                  prev  next  prev  next  prev  next  prev  next  prev  next 

在这个例子中,我们在双向链表的第二个位置插入了一个值为6的节点。你可以看到,新节点的prev指向了2,而next则指向了3。同时,原本在链表中第二个位置的节点2的next指向了新节点6,而在链表中第三个位置的节点3的prev指向了新节点6。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Java实现双向链表 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    这里提供一种Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法,共分为以下几个步骤: 步骤一:导入必要的依赖库 Java的MD5加密算法和FTP传输需要用到两个依赖库:commons-codec和commons-net。所以,需要在Java项目中导入相应的依赖库,示例代码如下: <dependency> <groupId&gt…

    Java 2023年5月23日
    00
  • Springboot拦截器如何获取@RequestBody参数

    下面是关于Spring Boot拦截器如何获取@RequestBody参数的攻略。 什么是拦截器 拦截器是Spring框架中的一个组件,它是在请求到达Controller之前或离开Controller之后执行的代码块。拦截器主要用于对请求进行预处理和后处理,在预处理中可以实现一些安全性检查和参数校验等操作,而后处理中可以对响应结果进行处理。 如何获取@Req…

    Java 2023年5月20日
    00
  • 深入Ajax代理的Java Servlet的实现详解

    “深入Ajax代理的Java Servlet的实现详解”是一篇介绍如何使用Java Servlet实现Ajax代理的文章。本文一共分为以下几个部分: Ajax代理的概念及作用 Java Servlet的基础知识 使用Java Servlet实现Ajax代理的步骤 示例说明 1. Ajax代理的概念及作用 Ajax代理是一种通过服务器中转Ajax请求的技术。在…

    Java 2023年6月16日
    00
  • 使用SpringBoot+AOP实现可插拔式日志的示例代码

    下面是使用SpringBoot+AOP实现可插拔式日志的完整攻略。 什么是SpringBoot+AOP Spring AOP(Aspect Oriented Programming)是Spring框架中的一个重要模块,用于将额外的行为(横切逻辑)注入到系统中的特定点。SpringBoot是Spring框架的一个特殊版本,通过预先配置好常用的Bean并提供自动…

    Java 2023年5月20日
    00
  • Spring MVC学习之DispatcherServlet请求处理详析

    Spring MVC学习之DispatcherServlet请求处理详析 Spring MVC 是一个基于 Java 的 Web 框架,它是 Spring Framework 的一部分。Spring MVC 提供了一种基于 MVC(Model-View-Controller)模式的 Web 应用程序开发方式。在 Spring MVC 中,Dispatcher…

    Java 2023年5月18日
    00
  • 什么是受检异常?

    什么是受检异常? 在Java中,对于可能会导致程序错误的代码,我们有时会在代码中使用异常机制进行处理,使得程序在运行时遇到问题时可以从异常处理代码块中恢复,继续执行后面的程序。而受检异常(Checked Exception)就是其中一种异常类型,它需要在代码中进行显式的处理,否则编译时就会报错。 受检异常的特点 受检异常与非受检异常(Unchecked Ex…

    Java 2023年4月27日
    00
  • 关于Maven的使用,这些你都真的了解么

    关于Maven的使用,这些你都真的了解么 什么是Maven? Maven是一个基于项目对象模型(POM),可以通过一小段描述文件来管理项目构建、依赖管理和文档编制等的工具。它可以帮助开发者快速构建Java项目。 Maven的安装 要使用Maven,需要先安装Maven。 以下是在Windows操作系统上安装Maven的方法: 去 Maven官网 下载Mave…

    Java 2023年5月20日
    00
  • 详解Struts2中json 相互引用死循环解决办法

    下面是详解Struts2中json 相互引用死循环解决办法的完整攻略。 简介 在 Struts2 中,使用 JSON 返回数据时,如果包含相互引用的对象,就会出现死循环的情况。这是因为在序列化时,对象互相引用,导致 Gson 序列化器无法判断对象的终止条件从而产生栈溢出。解决这个问题的方法是给予 JSON 序列化器一些帮助,在序列化时忽略相互引用的部分。 解…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部