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日

相关文章

  • 「学习笔记」数位 DP

    「学习笔记」数位 DP 意义不大的题不写了。 点击查看目录 目录 「学习笔记」数位 DP 概述 例题 P2657 [SCOI2009] windy 数 思路 代码 P4317 花神的数论题 思路 P4124 [CQOI2016]手机号码 思路 代码 haha数 题意 思路 代码 0和1的熟练 题意 思路 代码 苍与红的试炼 题意 思路 代码 概述 数位 DP…

    算法与数据结构 2023年4月17日
    00
  • C++如何实现BitMap数据结构

    下面我将详细讲解C++如何实现BitMap数据结构的完整攻略,包含以下几个方面: 什么是BitMap数据结构 如何使用C++实现BitMap数据结构 BitMap数据结构的应用示例说明 1. 什么是BitMap数据结构 BitMap数据结构也叫位图,是一种非常简单而高效的数据结构,它主要是用来对大量数字进行存储和操作的。所谓BitMap,就是将一个数字序列通…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • 详解Java中字典树(Trie树)的图解与实现

    详解Java中字典树(Trie树)的图解与实现 一、什么是字典树(Trie树) 字典树,又称为Trie树,是一种树形数据结构。常用于统计和排序大量的字符串。它支持快速插入和查找,并且可以用于词频统计。 二、字典树的基本性质 根节点不包含字符,除根节点外每个节点都只包含一个字符。 从根节点到某个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的…

    数据结构 2023年5月17日
    00
  • 代码随想录–二叉树

    二叉树 二叉树–二叉树的递归遍历 题目: 144.二叉树的前序遍历(opens new window) 145.二叉树的后序遍历(opens new window) 94.二叉树的中序遍历 题解: 前序遍历 class Solution { public List<Integer> preorderTraversal(TreeNode root…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之优先级队列(PriorityQueue)用法详解

    Java数据结构之优先级队列(PriorityQueue)用法详解 什么是优先级队列? 优先级队列(Priority Queue)是一种特殊的队列,它能够保证每次取出的元素都是优先级最高(或者最低)的元素。在实际应用中,优先级队列经常用来实现任务调度,负载均衡等。 Java中的优先级队列 在Java中,优先级队列实现了Queue接口,所以它也具有队列的基本特…

    数据结构 2023年5月17日
    00
  • 数据结构 双向链表的创建和读取详解及实例代码

    下面我为你详细讲解“数据结构 双向链表的创建和读取详解及实例代码”的完整攻略。 什么是双向链表? 双向链表是一种常见的线性数据结构,与单向链表相比,它可以在节点之间建立双向连接,使得在需要反向遍历链表时效率更高。每个节点同时保存了指向前一个节点和后一个节点的指针,因此双向链表也叫做双链表。 双向链表的创建 定义节点类 首先,我们需要定义一个表示节点的类,该类…

    数据结构 2023年5月16日
    00
  • C++数据结构之list详解

    C++数据结构之list详解 什么是list? list是C++ STL库中的一个数据结构,它能够以O(1)的复杂度在任何位置进行插入或删除操作,当然它也支持随机访问指定位置的元素。list属于双向链表,它内部结构为指针连接不同的节点。 如何使用list? 包含头文件 在C++中使用list,需要包含头文件#include <list>。 定义l…

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