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日

相关文章

  • 一文吃透JS树状结构的数据处理(增删改查)

    一文吃透JS树状结构的数据处理(增删改查) 什么是树状结构 树状结构是一种经典的数据结构,在计算机领域中被广泛应用。树状结构由连通的节点组成,节点之间形成父子关系。一根树状结构的“根节点”没有父节点,每个子节点可以有多个“子节点”,但一个“子节点”只能有一个“父节点”。常见的应用包括文件系统、HTML DOM 和 JSON 数据格式等。 数据结构设计 我们以…

    数据结构 2023年5月17日
    00
  • C语言实现通用数据结构之通用椎栈

    C语言实现通用数据结构之通用椎栈 概述 通用椎栈(Generic Linked List Stack),简称GLL Stack,是一种通用的数据结构,能够以动态的方式存储和访问任意类型的数据。GLL Stack 采用链表实现,可以进行进栈(push)、出栈(pop)、查看栈顶元素(peek)、判断栈是否为空(isEmpty)等基本操作。 基本操作 数据结构定…

    数据结构 2023年5月17日
    00
  • 数据结构用两个栈实现一个队列的实例

    下面我将详细讲解“数据结构用两个栈实现一个队列的实例”的完整攻略。 一、背景 在队列和栈这两种数据结构中,都可以实现数据的存储和操作。栈是一种后进先出(LIFO)的数据结构,而队列则是一种先进先出(FIFO)的数据结构。在实际应用中,很多场景需要同时具备队列和栈的特性,且要求效率较高,这时候就需要用两个栈实现一个队列的问题来解决了。 二、解决方案 考虑采用两…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法时间空间复杂度基础实践

    C语言数据结构与算法时间空间复杂度基础实践攻略 基本概念 时间复杂度:算法在执行时所需要的基本操作数,通常用O(n)表示,其中n是输入数据的规模。时间复杂度越小,算法执行所需要的时间越少,算法效率越高。 空间复杂度:算法在执行时所需要的额外空间数,通常用O(S)表示,其中S是额外的空间数。空间复杂度越小,所需的额外空间越少,算法的内存效率越高。 实践步骤 1…

    数据结构 2023年5月17日
    00
  • 「分治」黑白棋子的移动

    本题为3月23日23上半学期集训每日一题中A题的题解 题面 题目描述 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能…

    算法与数据结构 2023年4月18日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表的增删查改详解

    Java数据结构之链表的增删查改详解 简介 链表是非常常用的数据结构之一,它将数据储存在一个个结点中,每个结点存储了它所代表的数据和它下一个结点的指针,通过这些指针链接在一起,形成了一条链。 新建链表 // 定义链表中元素的结构 class ListNode { int val; ListNode next; ListNode(int x) { val = …

    数据结构 2023年5月17日
    00
  • CSP-何以包邮?

    题目描述 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。 试帮助小 P …

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