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日

相关文章

  • C#常用数据结构和算法总结

    C#常用数据结构和算法总结 数据结构 数组(Array) 数组是一种线性数据结构,它可以在内存中连续地存储相同类型的数据。可以使用索引访问数组中的元素。数组的元素可以是任意类型。 在 C# 中,定义一个数组需要指定数组的类型和数组的大小。例如,定义一个包含 5 个整数的数组: int[] arr = new int[5]; 链表(LinkedList) 链表…

    数据结构 2023年5月17日
    00
  • Java数据结构之实现跳表

    Java数据结构之实现跳表,是一篇对跳表数据结构的详细讲解。 背景 跳表是一种基于有序链表的高效查找算法,它的查找时间复杂度为O(logn),相比于普通链表的O(n),具有很大的优势。本文将介绍跳表的实现过程。 实现跳表 1. 跳表结构体 跳表的数据结构体实现包含以下四项: 头结点head:表示链表的起始位置。 节点Node:跳表中的节点,包含表层链表和下层…

    数据结构 2023年5月17日
    00
  • 基于python实现模拟数据结构模型

    实现一个模拟数据结构模型的过程需要考虑以下几个步骤: 确定数据结构类型,例如链表、栈、队列、二叉树等。 设计数据结构的具体实现方法,例如链表可采用节点、指针的方式实现,栈可以使用列表或数组实现,队列可使用循环队列实现等。 使用Python编写数据结构相关的类、方法、函数等,确保代码的可读性、灵活性和易维护性。 使用示例数据测试数据结构的各种操作,例如插入、删…

    数据结构 2023年5月17日
    00
  • C语言详细分析结构体的内存对齐规则

    C语言详细分析结构体的内存对齐规则 1. 什么是内存对齐 在计算机内存中,每个数据都需要分配一定的内存空间存储,这些空间的大小不一定相同。内存对齐就是要求每个数据按照某个规则,分配其所需的内存空间。 在C语言中,结构体是一种复合数据类型,由多个数据成员组成。结构体的数据成员排列顺序、数据类型均可能不同,因此需要内存对齐来规定内存空间的分配。 2. C语言中结…

    数据结构 2023年5月17日
    00
  • 详解C语言实现空间索引四叉树

    详解C语言实现空间索引四叉树攻略 四叉树是一种常见的空间索引方法,可以有效地处理二维或三维空间中的数据。本攻略将详细介绍使用C语言实现空间索引四叉树的方法,包括数据结构的设计,插入和查询操作的实现。 数据结构设计 结点结构体 struct QuadtreeNode { int depth; // 结点深度 double x, y; // 结点中心坐标 dou…

    数据结构 2023年5月17日
    00
  • 使用C语言构建基本的二叉树数据结构

    下面是使用C语言构建二叉树数据结构的步骤和示例: 1. 定义二叉树结构体类型 定义一个二叉树的结构体,包含节点值、左右子节点等信息: typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; 2. 实现创建二叉树的函数 实现一个函…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表、栈、队列、树的实现方法示例

    Java数据结构之链表、栈、队列、树的实现方法示例 链表 链表是一种线性数据结构,由节点的集合构成。每个节点包含两部分,数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点。 单向链表示例 public class LinkedList<E>{ private Node<E> head; private int siz…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之插入排序示例详解

    Go语言数据结构之插入排序示例详解 什么是插入排序? 插入排序是一种简单直观的排序方法,其基本思想是将一个待排序的序列分成已排序和未排序两部分,从未排序的部分中选择一个元素插入到已排序部分的合适位置,直到所有元素都被插入到已排序部分为止。 插入排序示例 示例1 我们来看一个数字序列的插入排序示例: package main import "fmt&…

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