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

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日

相关文章

  • Java数据结构之堆(优先队列)详解

    Java数据结构之堆(优先队列)详解 概述 堆是一种基于树的数据结构,它可以用来解决很多问题,例如排序、优先队列等。在堆中,每个节点的值都小于或等于它的子节点的值。堆分为两种类型:最大堆和最小堆。在最大堆中,根节点的值最大;而在最小堆中,根节点的值最小。 堆的操作主要有以下两种: 插入:将一个元素插入到堆中,需要维护堆的性质,即节点的值小于或等于子节点的值。…

    数据结构 2023年5月17日
    00
  • 详解python数据结构之队列Queue

    详解Python数据结构之队列 (Queue) 在计算机科学中,队列(Queue)是一种数据结构,可以用于按顺序存储和访问元素。该数据结构遵循先进先出(FIFO)原则,人们可以从队列的前面插入元素,从队列的后面删除元素。Python内置了队列模块(queue),这个模块实现了多线程安全队列、同步机制及相关数据结构。Queue模块提供了三种队列类型: FIFO…

    数据结构 2023年5月17日
    00
  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现 本文将详细讲解AC自动机算法在Java中的实现方法和原理,同时提供两个示例进行说明,使读者能够深入了解该算法并学会如何使用。 什么是AC自动机算法 AC自动机(Aho-Corasick Automaton)是多模式匹配的一种经典算法,其基本思路是将多个模式串构建成一颗“字典树”,然后对输入的文本串进行扫描匹配。相比于简…

    数据结构 2023年5月17日
    00
  • 数据结构之AVL树详解

    数据结构之AVL树详解 什么是AVL树? AVL树是一种自平衡的二叉搜索树,它的名称来自它的发明者Adelson-Velsky和Landis。在AVL树中,每个节点的左右子树的高度差(平衡因子)最多为1,否则需要通过旋转操作来重新平衡树。AVL树基于二叉搜索树,所以它包含了二叉搜索树的所有特性,同时也保证了树的高度始终处于对数级别,因此它的查找、插入、删除都…

    数据结构 2023年5月16日
    00
  • C++ 数据结构之布隆过滤器

    C++ 数据结构之布隆过滤器 简介 布隆过滤器是一种用于快速判断一个元素是否存在于一个集合中的数据结构。它的空间效率和查询效率都比较高,在某些场景下,它可以代替传统的哈希表。 原理 布隆过滤器的基本原理是:将一个元素映射为多个位数组中的位置。在插入元素时,将这些位置上的值设置为1;在查询元素时,如果这些位置上的值都为1,则认为元素存在于集合中;否则认为元素不…

    数据结构 2023年5月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
  • C语言 超详细总结讲解二叉树的概念与使用

    C语言 超详细总结讲解二叉树的概念与使用 1. 什么是二叉树? 二叉树是一种树状数据结构,其中每个节点最多有两个子节点,被称为左子节点和右子节点。具有以下几个特点: 每个节点最多有两个子节点; 左子节点可以为空,右子节点也可以为空; 二叉树的每个节点最多有一个父节点; 二叉树通常定义为递归模式定义,即每个节点都可以看做一棵新的二叉树。 2. 二叉树的遍历方式…

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