Java数据结构与算法之单链表深入理解

yizhihongxing

Java数据结构与算法之单链表深入理解攻略

什么是单链表?

单链表(Singly Linked List)是指一个节点只指向下一个节点的链表。

单链表由多个节点组成,每个节点有两个属性:数据域和指针域。数据域保存节点的数据,指针域保存下一个节点的指针,因此每个节点包含两个域:data和next。

单链表的基本操作

单链表常用的基本操作包括:

  1. 在链表头部添加元素
  2. 在链表尾部添加元素
  3. 在链表中间插入元素
  4. 删除链表中的某个元素
  5. 遍历链表

具体操作的实现代码如下:

在链表头部添加元素

public class LinkedList<T> {
    private Node<T> head;

    public void addFirst(T data) {
        head = new Node<>(data, head);
    }
}

在链表尾部添加元素

public class LinkedList<T> {
    private Node<T> head;

    public void addLast(T data) {
        if (head == null) {
            addFirst(data);
        } else {
            Node<T> ptr = head;
            while (ptr.next != null) {
                ptr = ptr.next;
            }
            ptr.next = new Node<>(data, null);
        }
    }

}

在链表中间插入元素

public class LinkedList<T> {
    private Node<T> head;

    public void addAfter(T item, T newItem) {
        if (head == null) {
            throw new NoSuchElementException();
        }
        Node<T> ptr = head;
        while (ptr != null && !ptr.data.equals(item)) {
            ptr = ptr.next;
        }
        if (ptr == null) {
            throw new NoSuchElementException();
        }
        ptr.next = new Node<>(newItem, ptr.next);
    }
}

删除链表中的某个元素

public class LinkedList<T> {
    private Node<T> head;

    public void remove(T item) {
        if (head == null) {
            throw new NoSuchElementException();
        }
        if (head.data.equals(item)) {
            head = head.next;
            return;
        }
        Node<T> ptr = head;
        while (ptr.next != null && !ptr.next.data.equals(item)) {
            ptr = ptr.next;
        }
        if (ptr.next == null) {
            throw new NoSuchElementException();
        }
        ptr.next = ptr.next.next;
    }

}

遍历链表

public class LinkedList<T> {
    private Node<T> head;

    public void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (Node<T> ptr = head; ptr != null; ptr = ptr.next) {
            action.accept(ptr.data);
        }
    }
}

单链表的应用

单链表可以应用到栈、队列的实现以及图的广度优先遍历等。

示例一:栈的实现

public class Stack<T> {
    private final LinkedList<T> list = new LinkedList<>();

    public void push(T data) {
        list.addFirst(data);
    }

    public T pop() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        T item = peek();
        list.remove(item);
        return item;
    }

    public T peek() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        return list.getFirst();
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }
}

示例二:图的广度优先遍历

public class Graph {
    private final LinkedList<Integer>[] adj;

    public Graph(int size) {
        adj = new LinkedList[size];
        for (int i = 0; i < size; i++) {
            adj[i] = new LinkedList<>();
        }
    }

    public void addEdge(int v, int w) {
        adj[v].addLast(w);
    }

    public void BFS(int s) {
        boolean[] visited = new boolean[adj.length];
        LinkedList<Integer> queue = new LinkedList<>();
        visited[s] = true;
        queue.add(s);
        while (queue.size() != 0) {
            s = queue.poll();
            System.out.print(s + " ");
            for (int i = 0; i < adj[s].size(); i++) {
                int n = adj[s].get(i);
                if (!visited[n]) {
                    visited[n] = true;
                    queue.add(n);
                }
            }
        }
    }
}

总结

单链表是一种常用的数据结构,是栈、队列实现和图搜索算法中基础的数据结构之一。针对单链表的基本操作,我们除了掌握其操作的实现方法,更需要理解其操作的本质意义和实际意义,才能更好地应用到具体的场景中。

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

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

相关文章

  • c++ 数据结构map的使用详解

    c++ 数据结构map的使用详解 什么是map map是C++ STL中提供的一种用以存储键值对(key-value)的容器。它能够以平均O(log n)复杂度进行搜索、插入、删除操作,并且保持元素顺序,是一种比较高效的数据结构。 map的基本用法 定义map 定义map需要包含头文件<map>。 语法:map<key_type, valu…

    数据结构 2023年5月17日
    00
  • 设要采用CRC编码传送的数据信息x=1001,当生成多项式为G(x)=1101时,请写出它的循环校验码。若接收方收到的数据信息x’ =1101,说明如何定位错误并纠正错误

    题目:设要采用CRC编码传送的数据信息x=1001,当生成多项式为G(x)=1101时,请写出它的循环校验码。若接收方收到的数据信息x’ =1101,说明如何定位错误并纠正错误 根据题目描述,需要采用CRC编码对数据信息x=1001进行编码,生成多项式为G(x)=1101。下面是计算循环冗余校验码的步骤:1.首先将数据信息x乘以x的次数,使得它的位数与G(x…

    算法与数据结构 2023年4月18日
    00
  • C语言数据结构与算法之图的遍历(一)

    我来给您详细讲解一下“C语言数据结构与算法之图的遍历(一)”的完整攻略。 简介 本篇攻略主要介绍了图的遍历问题。图是由若干个点和连接这些点的边构成的数据结构,常用来表示复杂的关系和网络。图的遍历就是从图的某一点开始,按照一定的规则沿着边逐个访问图中所有的点,不重不漏地遍历整个图。 在本篇攻略中,我们将探讨图的深度优先遍历(DFS)和广度优先遍历(BFS)两种…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表的概念及结构

    Java数据结构之链表的概念及结构 链表的概念 链表是一种非顺序存储的容器,它由一个个结点组成,每个结点包含两部分,数据域和指针域。数据域是存储数据的部分,指针域是指向下一个结点的位置。 相比于数组,链表插入和删除操作的时间复杂度更低,但是访问元素时需要遍历整个链表,时间复杂度相对较高。 链表的结构 链表结构包含两个重要的部分:结点和链表。 结点(Node)…

    数据结构 2023年5月16日
    00
  • 举例讲解C语言程序中对二叉树数据结构的各种遍历方式

    那么我们先来介绍一下二叉树。 什么是二叉树? 二叉树是一种树状的数据结构,它的每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树节点的定义如下: typedef struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NUL…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解 什么是单链表 链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。 单链表节点的定义 单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。 以下是单链表节点的定义: typedef struct node { i…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • C#数据结构揭秘一

    C#数据结构揭秘一攻略 C#数据结构是每个C#程序员必须熟练掌握的技能之一。本攻略将介绍常见的C#数据结构,包括数组、列表、栈、队列、散列表和字典。我们将会深入了解它们的特点、使用场景和使用方法,并附带代码示例加深理解。 数组 数组是存储单一类型元素的固定大小的集合结构。在C#中,可以使用以下方式声明和初始化一个数组: int[] nums1 = new i…

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