Java双向链表的操作

yizhihongxing

当我们需要对数据进行频繁的插入、删除等动态操作时,使用链表作为数据结构可以达到良好的效果。而双向链表相比单向链表,可以在 O(1) 的时间内实现任一结点的插入、删除或查找前驱、后继等操作。下面是 Java 双向链表的操作攻略。

定义结点类

class DListNode<T> {
  T val;
  DListNode<T> prev, next;
  public DListNode(T val) {
    this.val = val;
    prev = null;
    next = null;
  }
}

定义双向链表类

class DoubleLinkedList<T> {
  DListNode<T> head, tail;
  int size;
  public DoubleLinkedList() {
    head = null;
    tail = null;
    size = 0;
  }
}

其中 head 表示链表的头结点,tail 表示链表的尾节点,size 表示链表的长度。初始时链表为空,即 headtail 都为 null。

插入结点

插入结点时,我们需要新建一个结点,并把该结点插入到链表中。假设我们需要在链表中插入一个值为 val 的结点,插入位置为 pos,则可以使用以下代码:

public void add(T val, int pos) {
  if (pos < 0 || pos > size) {
    // 判断 pos 的合法性
    throw new IndexOutOfBoundsException();
  }
  DListNode<T> node = new DListNode<>(val);
  if (size == 0) {
    // 链表为空时直接把新结点设为头结点和尾节点
    head = node;
    tail = node;
  } else if (pos == 0) {
    // 插入到头部,更新头结点
    node.next = head;
    head.prev = node;
    head = node;
  } else if (pos == size) {
    // 插入到尾部,更新尾节点
    tail.next = node;
    node.prev = tail;
    tail = node;
  } else {
    // 插入到中间位置,找到插入位置的前一个节点 prev,和后一个节点 next,
    // 将新结点的 prev 指向 prev,next 指向 next
    DListNode<T> prev = getNode(pos - 1);
    DListNode<T> next = prev.next;
    prev.next = node;
    node.prev = prev;
    node.next = next;
    next.prev = node;
  }
  size++;
}

// 获取第 pos 个结点
private DListNode<T> getNode(int pos) {
  DListNode<T> node = head;
  for (int i = 0; i < pos; i++) {
    node = node.next;
  }
  return node;
}

删除结点

删除结点时,我们先找到要删除的结点,然后将其断开与前一个节点和后一个节点的连接,最后释放该结点的内存。

public void remove(int pos) {
  if (pos < 0 || pos >= size) {
    // 判断 pos 的合法性
    throw new IndexOutOfBoundsException();
  }
  if (size == 1) {
    // 只有一个节点,删除后链表为空
    head = null;
    tail = null;
  } else if (pos == 0) {
    // 删除头结点
    head = head.next;
    head.prev = null;
  } else if (pos == size - 1) {
    // 删除尾节点
    tail = tail.prev;
    tail.next = null;
  } else {
    // 删除中间节点,找到要删除的节点 prev 和 next,
    // 将 prev 的 next 指向 next,next 的 prev 指向 prev,断开要删除的节点与链表的连接
    DListNode<T> node = getNode(pos);
    DListNode<T> prev = node.prev;
    DListNode<T> next = node.next;
    prev.next = next;
    next.prev = prev;
    node.prev = null;
    node.next = null;
  }
  size--;
}

示例

下面展示向双向链表中插入和删除节点的示例:

DoubleLinkedList<Integer> list = new DoubleLinkedList<>();
// 向双向链表中插入节点:1, 2, 3
list.add(1, 0);
list.add(2, 1);
list.add(3, 2);
// 删除第二个节点
list.remove(1);

执行完上述代码后,链表中的结点为 1 和 3。

DoubleLinkedList<String> list = new DoubleLinkedList<>();
// 向双向链表中插入节点:"a", "b", "c"
list.add("a", 0);
list.add("b", 1);
list.add("c", 2);
// 删除第一个节点
list.remove(0);

执行完上述代码后,链表中的结点为 "b" 和 "c"。

以上就是 Java 双向链表的操作攻略,希望能对你有所帮助。

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

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • php服务器配置环境变量

    以下是关于“PHP服务器配置环境变量”的完整攻略,包括基本概念、解决方法、示例说明和注意事项。 基本概念 在PHP服务器中,环境变量是一种存储在操作系统中的,可以在PHP脚本中使用的变量。环境变量可以包含有关服务器的信息,例如服务器的IP地址、端口号、数据库连接信息等。在PHP服务器中,配置环境变量可以帮助我们更好地管理服务器和应用程序。 解决方法 以下是P…

    other 2023年5月7日
    00
  • ora-00905:缺少关键字错误oracle

    下面是关于“ora-00905:缺少关键字错误oracle”的完整攻略: 1. 问题描述 在使用Oracle数据库时,可能会出现“ora-00905缺少关键字错误oracle”错误。这是什么原因呢?如何解决这个问题呢? 2. 解决方法 当出ora-00905:缺少关键字错误oracle”错误时,可能是由于以下原因导致的: SQL语句语法错误。 SQL句中缺少…

    other 2023年5月7日
    00
  • Javascript算符的优先级介绍

    Javascript运算符的优先级介绍 什么是运算符优先级? 在Javascript中,表达式是由运算符和操作数组成的。运算符的优先级决定了它们的执行顺序。当表达式中存在多个运算符时,拥有高优先级的运算符会先执行,而低优先级的运算符会在后续执行。 运算符的优先级分类 Javascript中的运算符可以分为以下几类,按照优先级从高到低排列:1. 成员访问符 (…

    other 2023年6月28日
    00
  • R语言变量级别的数据处理操作

    R语言变量级别的数据处理操作攻略 在R语言中,我们可以使用各种函数和操作符来处理变量级别的数据。这些操作可以帮助我们对数据进行转换、筛选、汇总等处理,以满足我们的分析需求。下面是一个详细的攻略,包含了常用的操作和两个示例说明。 1. 变量类型转换 在处理数据时,我们经常需要将变量从一种类型转换为另一种类型。R语言提供了一些函数来实现这一目的。 1.1. 转换…

    other 2023年8月16日
    00
  • ae怎么制作一段倒计时效果?

    当制作一段倒计时效果时,可以使用HTML、CSS和JavaScript来实现。下面是一个详细的攻略,包含两个示例说明。 步骤1:创建HTML结构 首先,我们需要创建一个HTML文件,并添加所需的元素。在<body>标签中添加一个<div>元素,用于显示倒计时。示例代码如下: <!DOCTYPE html> <html…

    other 2023年7月28日
    00
  • Linux平台安装MongoDB及使用Docker安装MongoDB

    Linux平台安装MongoDB及使用Docker安装MongoDB 简介 MongoDB 是一个 NoSQL 数据库,它的灵活性、高效性使其成为互联网数据存储和查询的首选方案。MongoDB 具有良好的数据可扩展性,支持水平和垂直扩展。本文将介绍如何在 Linux 平台上安装 MongoDB 和使用 Docker 安装 MongoDB。 在 Linux 平…

    其他 2023年3月28日
    00
  • Mac键盘失灵怎么办?Mac键盘部分按键失灵解决方法

    Mac键盘失灵怎么办? 如果在使用 Mac 电脑时,发现部分键盘按键失灵,该怎么办呢?下面提供几种常见的解决方法。 方法一:清洁键盘 键盘上的灰尘、污渍等可能会导致键盘按键失灵,因此可以通过清洁键盘的方式解决。 首先将 Mac 电脑关机,然后将键盘翻转,轻敲键盘的背面以使灰尘等物质脱落。 使用尘刷或吸尘器,清除键盘表面的灰尘和脏污。 可以将一些易脱落的键帽从…

    other 2023年6月27日
    00
  • jsTree树控件(基于jQuery, 超强悍)[推荐]

    jsTree是基于jQuery开发的树形控件,可以用来处理大量的数据和层次结构。 jsTree最基本的功能是构建树形结构,可以轻松地将任何数据转换为树形结构,并呈现出来。它的强大性在于可以通过自定义插件来拓展其功能,例如搜索、拖拽、复制/粘贴、节点编辑、多选/单选等等。 下面是使用jsTree的基本步骤: 步骤1:引入jQuery和jsTree 首先,在你的…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部