Java数据结构之单链表详解

yizhihongxing

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

什么是单链表?

单链表是一种线性数据结构,它由一系列结点组成,每个结点包含数据域和指针域。数据域用于存储数据,指针域用于指向下一个结点。单链表的优点是插入和删除操作的时间复杂度为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日

相关文章

  • 数据结构之堆详解

    数据结构之堆详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构。堆具有以下两个特点: 堆是一颗完全二叉树; 堆中每个节点的值都必须大于等于或小于等于其左右子节点的值,分别称作大根堆和小根堆。 上述的大根堆和小根堆其实是两种不同的堆的实现方式。对于大根堆,每个节点的值都比其左右子节点的值要大;小根堆则相反,每个节点的值都比其左右子节点的值要小。 堆的基本…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构基础详解小白篇

    C语言编程数据结构基础详解小白篇攻略 1. 确定学习目标 在学习过程中,需要明确学习目标。对于小白来说,首先要了解C语言的基本语法,同时也需要掌握常用的数据结构。 2. 学习基本语法 2.1 变量和数据类型 C语言的变量必须先定义后使用 常用的数据类型包括整型、字符型、浮点型等 2.2 控制流程 C语言中常用的控制流程包括条件语句和循环语句 条件语句包括if…

    数据结构 2023年5月17日
    00
  • C++数据结构之链表详解

    C++数据结构之链表详解 链表是一种重要的数据结构,它可以动态的分配内存空间,实现灵活的元素插入,删除等操作。本文将详细讲解链表的定义、实现、常见操作以及链表的应用。 定义与特点 链表是一种线性表数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单向链表和双向链表,其中单向链表的每个节点只包含一个指针,指向下一个节点,而双向链表的每…

    数据结构 2023年5月17日
    00
  • 数据结构基本概念和术语之位字节、字、位串、元素等

    我们先来一一解释数据结构中的基本概念和术语: 1. 位 位是计算机中的最小存储单位,通常表示二进制0或1。8个位组成了1个字节,常用于表示和处理计算机中的文件、数据、程序等。 2. 字节 字节是计算机中的基本存储单位之一,由8个位组成,通常表示1个英文字符或者1个二进制数。在计算机存储中,通常以字节为单位进行数据的存储与传输。 3. 位串 一个由0或1构成的…

    数据结构 2023年5月17日
    00
  • C语言数据结构之平衡二叉树(AVL树)实现方法示例

    C语言数据结构之平衡二叉树(AVL树)实现方法示例 介绍 AVL树是一种自平衡二叉搜索树,它保证了所有节点的左右子树高度差不超过1,从而提高了查找、插入和删除操作的效率。本篇文章将介绍如何使用C语言实现AVL树,并提供两个例子以说明实现方法。 实现方法 结构体定义 首先,定义AVL树节点的结构体,包括该节点存储的值、该节点的高度、该节点的左右子树指针。 ty…

    数据结构 2023年5月17日
    00
  • 多维度深入分析Redis的5种基本数据结构

    多维度深入分析Redis的5种基本数据结构 Redis是一种高性能、内存数据存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。其中,每种数据结构都具有不同的特性和用途,本文将对这五种基本数据结构进行深入分析。 1. 字符串(string) 字符串是最基本的数据结构,一个字符串可以存储任意二进制数据,例如一个jpg图片或者一个序列化的对象…

    数据结构 2023年5月17日
    00
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
  • JS中数据结构之栈

    接下来我将为大家讲解JS中数据结构之栈的完整攻略。 一、栈的定义 栈是一种受限的线性数据结构,它具有先进后出(Last In First Out, LIFO)的特点,即后进入的元素先出来。栈主要有两个操作:入栈和出栈,同时还需要考虑栈空和栈满两种特殊情况。 二、栈的实现 在JS中,可以通过数组来实现栈的功能。下面是一个实现栈的类: class Stack {…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部