Java数据结构之单链表详解

下面是单链表攻略的详细讲解。

什么是单链表?

单链表是一种线性数据结构,它由一系列结点组成,每个结点包含数据域和指针域。数据域用于存储数据,指针域用于指向下一个结点。单链表的优点是插入和删除操作的时间复杂度为O(1),缺点是随机访问的时间复杂度为O(n)。

单链表的基本操作

单链表的基本操作包括插入操作、删除操作、查找操作和遍历操作。下面将分别介绍这些操作。

插入操作

单链表的插入操作有三种情况:在表头插入、在表尾插入和在指定位置插入。

  • 在表头插入:新结点成为头结点,原来的头结点成为新结点的后继结点。

在Java语言中,实现代码如下:

public void addFirst(E e) {
    Node<E> newNode = new Node<>(e);
    newNode.next = head;
    head = newNode;
    size++;
}
  • 在表尾插入:新结点成为尾结点,原来的尾结点成为新结点的前驱结点。

在Java语言中,实现代码如下:

public void addLast(E e) {
    Node<E> newNode = new Node<>(e);
    if (size == 0) {
        head = newNode;
    } else {
        Node<E> last = head;
        while (last.next != null) {
            last = last.next;
        }
        last.next = newNode;
    }
    size++;
}
  • 在指定位置插入:新结点插入到指定位置,前驱结点指向新结点,新结点指向后继结点。

在Java语言中,实现代码如下:

public void add(int index, E e) {
    if (index < 0 || index > size) {
        throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
    }
    if (index == 0) {
        addFirst(e);
    } else {
        Node<E> prev = head;
        for (int i = 0; i < index - 1; i++) {
            prev = prev.next;
        }
        Node<E> newNode = new Node<>(e);
        newNode.next = prev.next;
        prev.next = newNode;
        size++;
    }
}

删除操作

单链表的删除操作也有三种情况:删除头结点、删除尾结点和删除指定位置。

  • 删除头结点:头结点指向后继结点。

在Java语言中,实现代码如下:

public E removeFirst() {
    if (size == 0) {
        throw new NoSuchElementException();
    }
    Node<E> first = head;
    head = first.next;
    size--;
    return first.data;
}
  • 删除尾结点:遍历到尾结点的前驱结点,前驱结点的后继结点指向null。

在Java语言中,实现代码如下:

public E removeLast() {
    if (size == 0) {
        throw new NoSuchElementException();
    }
    Node<E> last = head, prev = null;
    while (last.next != null) {
        prev = last;
        last = last.next;
    }
    if (prev == null) {
        head = null;
    } else {
        prev.next = null;
    }
    size--;
    return last.data;
}
  • 在指定位置删除:遍历到指定位置的前驱结点,前驱结点的后继结点指向删除结点的后继结点。

在Java语言中,实现代码如下:

public E remove(int index) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
    }
    if (index == 0) {
        return removeFirst();
    } else {
        Node<E> prev = head;
        for (int i = 0; i < index - 1; i++) {
            prev = prev.next;
        }
        Node<E> current = prev.next;
        prev.next = current.next;
        size--;
        return current.data;
    }
}

查找操作

单链表的查找操作是指查找某个元素是否在单链表中,如果存在则返回元素的下标,否则返回-1。

在Java语言中,实现代码如下:

public int indexOf(Object o) {
    int index = 0;
    if (o == null) {
        for (Node<E> current = head; current != null; current = current.next) {
            if (current.data == null) {
                return index;
            }
            index++;
        }
    } else {
        for (Node<E> current = head; current != null; current = current.next) {
            if (o.equals(current.data)) {
                return index;
            }
            index++;
        }
    }
    return -1;
}

遍历操作

单链表的遍历操作是指遍历单链表中的所有元素,输出每个元素的值。

在Java语言中,实现代码如下:

public void traverse() {
    for (Node<E> current = head; current != null; current = current.next) {
        System.out.print(current.data + " ");
    }
    System.out.println();
}

示例说明

示例1:在指定位置插入节点

假设有一个单链表,初始状态为:

1->3->5

现在要在第二个结点后面插入一个结点2,操作后单链表变为:

1->3->2->5

Java代码实现如下:

SingleLinkedList<Integer> list = new SingleLinkedList<>();
list.add(0, 1);
list.add(1, 3);
list.add(2, 5);
list.add(2, 2);
list.traverse();

输出结果为:1 3 2 5

示例2:删除指定位置的节点

假设有一个单链表,初始状态为:

1->2->3->4

现在要删除第三个结点,操作后单链表变为:

1->2->4

Java代码实现如下:

SingleLinkedList<Integer> list = new SingleLinkedList<>();
list.add(0, 1);
list.add(1, 2);
list.add(2, 3);
list.add(3, 4);
list.remove(2);
list.traverse();

输出结果为:1 2 4

以上就是单链表详解的攻略,希望对大家有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之单链表详解 - Python技术站

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

相关文章

  • Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)

    Java数据结构及算法实例:快速计算二进制数中1的个数 简介 本文将介绍在Java中快速计算二进制数中1的个数的算法。本算法是一种基于位运算的算法,其核心思想是利用位运算的快捷性,将原问题转化为每次计算一位是否为1的问题,使得计算速度大大提升。 背景知识 在理解本算法之前,需要了解Java中的一些背景知识: 1. 位运算 Java中的位运算符有如下几个: &…

    数据结构 2023年5月17日
    00
  • C语言从猜数字游戏中理解数据结构

    C语言从猜数字游戏中理解数据结构 介绍 在游戏和编程之间有着密切的关系。猜数字游戏是一个经典的小游戏,它也可以作为学习数据结构的一个好教材。 在猜数字游戏中,你可以根据计算机所选数字的提示来猜出正确的数字。这个游戏可以帮助你更好地理解数据结构和算法。 游戏规则 1.计算机系统选择一个要猜的数字。 2.你需要猜出这个数字,计算机每次将你的猜测数字与要猜的数字进…

    数据结构 2023年5月17日
    00
  • Java 超详细图解集合框架的数据结构

    下面是完整攻略: Java 超详细图解集合框架的数据结构 简介 集合框架是Java中最基础的数据结构之一,是大部分Java程序员必须掌握的基础知识。这个框架提供了常用的数据结构和算法,包括List、Set、Map等等。本文将带领您从数据结构的角度详细解析Java集合框架中的各种数据结构,让您能够清晰地掌握它们的特点和使用方法。 数据结构 Java集合框架中的…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十三天–数据库(3)

    当我们准备面试数据库相关的职位时,需要掌握SQL语言和常见的数据库管理系统。下面是针对Java面试中可能出现的常见数据库面试题的一些攻略。 1. 数据库连接的常见方式 在Java中,要与数据库连接有两种方式:JDBC和ORM框架。 (1) JDBC JDBC是Java连接数据库的标准方式,使用JDBC可以通过Java程序来连接不同的数据库。连接数据库的步骤包…

    数据结构 2023年5月17日
    00
  • Java数据结构之双端链表原理与实现方法

    Java数据结构之双端链表原理与实现方法 一、什么是双端链表? 双端链表是一种链式数据结构,它每个节点都有两个指针:一个指向前一个节点,一个指向后一个节点。它具有链表的所有特点,而且还有一些独特的优点:对于一个双向链表,我们可以从头到尾遍历,也可以从尾到头遍历。在某些情况下,它比单向链表更有用,因为它可以执行逆序遍历。 二、双端链表的原理 双端链表由节点构成…

    数据结构 2023年5月17日
    00
  • GPS北斗卫星时间同步系统助力电力自动化网络系统

    GPS北斗卫星时间同步系统助力电力自动化网络系统 GPS北斗卫星时间同步系统助力电力自动化网络系统 京准电子官微——ahjzsz 前言 近几年来,随着电力自动化水平的提高,在电力中计算机监控系统、微机保护装置、微机故障录波装置以及各类数据管理机得到了广泛的应用,而这些自动装置的配合工作需要有一个精确统一的时间。当电力系统发生故障时,既可实现全站各系统在统一时…

    算法与数据结构 2023年5月8日
    00
  • Java数据结构之线段树的原理与实现

    Java数据结构之线段树的原理与实现 什么是线段树 线段树是一种基于分治思想的数据结构,它可以用来解决各种区间查询问题,例如区间求和、最大值、最小值等等。在算法竞赛和数据结构课程中,线段树被广泛应用,是一种非常实用的数据结构。 线段树的基本原理 线段树是一种二叉树,它的每个节点包含一个区间,叶子节点表示区间中的单个元素,非叶子节点表示区间的合并。 线段树的建…

    数据结构 2023年5月17日
    00
  • 棋盘覆盖问题——分治法

    问题描述 有一个 x (k>0)的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格。现在要用如下图所示的L形骨牌覆盖除了特殊方格以外的其他全部方格,骨牌可以任意旋转,并且任何两个骨牌不能重复。请给出一种覆盖方式。   样例: 输入: 输出:   思路——分治法: 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。 递归…

    算法与数据结构 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部