基于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日

相关文章

  • JavaScript ES6的新特性使用新方法定义Class

    关于JavaScript ES6的新特性中使用新方法定义Class的完整攻略,本文将对其进行详细分析和阐述。 什么是Class? 在ES6之前,在JavaScript中定义对象通常使用函数。然而,ES6引入了一个新的类概念,使得定义对象变得更加简单和可读性更强。一个类可以看作是一个对象的蓝图,可以用来创建一组拥有相同属性和方法的对象。 使用新方法定义Clas…

    Java 2023年5月23日
    00
  • Java split函数拆分后变成null问题解决方案

    Java中的split函数用于将字符串根据指定字符分割成多个子字符串。然而,有时候在使用split函数时,会出现拆分之后子字符串变成null的问题,本篇文档将提供解决方案。 问题分析 在使用split函数时,使用的分割符在字符串的开头或结尾时,会导致split函数将空字符串分割出来。此时,split函数会把空字符串转换为null,导致出现这个问题。 解决方案…

    Java 2023年5月26日
    00
  • Java标识接口的使用方法

    Java标识接口是一种没有成员的接口,其存在的唯一目的是将接口实现类标识为一种特定的类型。本篇攻略将为您详细介绍Java标识接口的使用方法。 什么是Java标识接口? Java标识接口是一种特殊的接口,其定义了一个接口实现类属于一个特定类型的语义,而不是定义了一个接口实现类需要提供什么方法。因此,标识接口中不包含任何方法。 Java标识接口的作用 Java标…

    Java 2023年5月26日
    00
  • Java中的拦截器、过滤器、监听器用法详解

    Java中的拦截器、过滤器、监听器用法详解 Java中的拦截器、过滤器、监听器是Web开发中常用的几种组件,它们可以用于拦截、修改请求和响应、监听特定事件等。本文将详细讲解它们的用法。 过滤器(Filter) 在Java Web应用中,过滤器可以用于拦截请求和响应,这使得过滤器非常有用,能够实现很多功能,例如:HTTP缓存、字符编码、安全等。 以下是一个过滤…

    Java 2023年6月15日
    00
  • Spring Boot开启的2种方式详解

    SpringBoot开启的2种方式详解 SpringBoot是一种基于Spring框架的开发应用程序的工具,能够使开发者更加便捷地构建、部署和运行Web应用程序。在使用SpringBoot时,需要开启工程,下面介绍SpringBoot的两种开启方式。 方式一:使用Spring Boot Maven 插件快速启动工程 使用Spring Boot Maven插件…

    Java 2023年5月15日
    00
  • IntelliJ IDEA引入第三方jar包或查看Java源码的时候报decompiled.class file bytecode version:52.0(java 8)错误的解决办法

    当我们在使用 IntelliJ IDEA 引入第三方jar包或查看Java源码的时候,有时会出现以下错误提示信息: Error: java: decompiled.class file bytecode version:52.0 (java 8) 这是因为项目使用的Java版本与第三方jar包或源码使用的Java版本不一致导致的。要解决此问题,我们需要采取以…

    Java 2023年5月20日
    00
  • 浅谈java object对象在heap中的结构

    浅谈Java Object对象在Heap中的结构 介绍 Java内存分为栈内存和堆内存,栈内存用于存储局部变量和方法调用的信息,而堆内存用于存储动态分配的对象和数组。在堆内存中,Java对象存储在对象头和对象实例数据两部分中。 Java对象头结构 Java对象在内存中的结构包括对象头和对象实例数据两部分,对象头的大小在不同的JVM实现中有所不同,取决于虚拟机…

    Java 2023年5月26日
    00
  • Java Document生成和解析XML操作

    首先,让我们来理解一下Java Document和XML的概念。 Java Document是一个可以修改或是读取XML文件的API,它提供了很多的方法用来增删查改XML文档的节点和属性。 XML是一种标记语言,可以用来存储和传输数据。它的格式在Internet中被广泛使用,尤其是在Web Service中用来传递数据。 接下来,我们来详细讲解一下Java …

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