Java数据结构之链表相关知识总结

Java数据结构之链表相关知识总结

链表是一种非常常用的数据结构,它有许多实际应用,比如链表可以用来实现栈、队列、散列表和图等数据结构。在Java语言中,链表的实现方式主要有单向链表、双向链表和循环链表。

单向链表

单向链表是一种链表结构,每个节点包含两个元素:节点值和一个指向下一个节点的引用。链表的头结点(第一个节点)不包含值,仅包含指向链表中第一个实际节点的引用。

单向链表的实现示例如下:

public class SingleLinkedList {
    private Node head; // 头结点,不包含值
    private int size; // 链表长度

    // 内部类Node,封装链表节点的值和next引用
    private class Node {
        Object value; // 节点的值
        Node next; // 指向下一个节点的引用

        public Node(Object value) {
            this.value = value;
        }
    }

    // 在头部插入节点
    public void addFirst(Object value) {
        Node newNode = new Node(value);
        newNode.next = head;
        head = newNode;
        size++;
    }

    // 在尾部插入节点
    public void addLast(Object value) {
        Node newNode = new Node(value);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
        size++;
    }

    // 在指定位置插入节点
    public void add(int index, Object value) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException();
        }
        if (index == 0) {
            addFirst(value);
        } else if (index == size) {
            addLast(value);
        } else {
            Node newNode = new Node(value);
            Node current = head;
            for (int i = 0; i < index - 1; i++) {
                current = current.next;
            }
            newNode.next = current.next;
            current.next = newNode;
            size++;
        }
    }

    // 删除头节点,返回删除的节点值
    public Object removeFirst() {
        if (head == null) {
            throw new NoSuchElementException();
        }
        Object value = head.value;
        head = head.next;
        size--;
        return value;
    }

    // 删除尾节点,返回删除的节点值
    public Object removeLast() {
        if (head == null) {
            throw new NoSuchElementException();
        }
        if (head.next == null) {
            Object value = head.value;
            head = null;
            size--;
            return value;
        }
        Node current = head;
        while (current.next.next != null) {
            current = current.next;
        }
        Object value = current.next.value;
        current.next = null;
        size--;
        return value;
    }

    // 删除指定位置的节点,返回删除的节点值
    public Object remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        if (index == 0) {
            return removeFirst();
        } else if (index == size - 1) {
            return removeLast();
        } else {
            Node current = head;
            for (int i = 0; i < index - 1; i++) {
                current = current.next;
            }
            Object value = current.next.value;
            current.next = current.next.next;
            size--;
            return value;
        }
    }

    // 获取链表长度
    public int size() {
        return size;
    }

    // 获取指定位置的节点值
    public Object get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        Node current = head;
        for (int i = 0; i < index; i++) {
            current = current.next;
        }
        return current.value;
    }
}

双向链表

双向链表是一种链表结构,每个节点包含三个元素:前一个节点的引用、节点值和下一个节点的引用。链表的头结点(第一个节点)和尾节点(最后一个节点)都存在。

双向链表的实现示例如下:

public class DoubleLinkedList {
    private Node head; // 头结点,不包含值
    private Node tail; // 尾节点,不包含值
    private int size; // 链表长度

    // 内部类Node,封装链表节点的值、prev引用和next引用
    private class Node {
        Object value; // 节点的值
        Node prev; // 指向前一个节点的引用
        Node next; // 指向下一个节点的引用

        public Node(Object value) {
            this.value = value;
        }
    }

    // 在头部插入节点
    public void addFirst(Object value) {
        Node newNode = new Node(value);
        if (head != null) {
            head.prev = newNode;
        } else {
            tail = newNode;
        }
        newNode.next = head;
        head = newNode;
        size++;
    }

    // 在尾部插入节点
    public void addLast(Object value) {
        Node newNode = new Node(value);
        if (head == null) {
            head = newNode;
        } else {
            tail.next = newNode;
            newNode.prev = tail;
        }
        tail = newNode;
        size++;
    }

    // 在指定位置插入节点
    public void add(int index, Object value) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException();
        }
        if (index == 0) {
            addFirst(value);
        } else if (index == size) {
            addLast(value);
        } else {
            Node newNode = new Node(value);
            Node current = head;
            for (int i = 0; i < index - 1; i++) {
                current = current.next;
            }
            newNode.next = current.next;
            newNode.prev = current;
            current.next.prev = newNode;
            current.next = newNode;
            size++;
        }
    }

    // 删除头节点,返回删除的节点值
    public Object removeFirst() {
        if (head == null) {
            throw new NoSuchElementException();
        }
        Object value = head.value;
        head = head.next;
        if (head != null) {
            head.prev = null;
        } else {
            tail = null;
        }
        size--;
        return value;
    }

    // 删除尾节点,返回删除的节点值
    public Object removeLast() {
        if (head == null) {
            throw new NoSuchElementException();
        }
        Object value = tail.value;
        tail = tail.prev;
        if (tail != null) {
            tail.next = null;
        } else {
            head = null;
        }
        size--;
        return value;
    }

    // 删除指定位置的节点,返回删除的节点值
    public Object remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        if (index == 0) {
            return removeFirst();
        } else if (index == size - 1) {
            return removeLast();
        } else {
            Node current = head;
            for (int i = 0; i < index - 1; i++) {
                current = current.next;
            }
            Object value = current.next.value;
            current.next = current.next.next;
            current.next.prev = current;
            size--;
            return value;
        }
    }

    // 获取链表长度
    public int size() {
        return size;
    }

    // 获取指定位置的节点值
    public Object get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        Node current = head;
        for (int i = 0; i < index; i++) {
            current = current.next;
        }
        return current.value;
    }
}

示例说明

示例一

SingleLinkedList list = new SingleLinkedList();
list.addFirst(1); // 在头部插入节点
list.addLast(3); // 在尾部插入节点
list.add(1, 2); // 在指定位置插入节点
System.out.println(list.size()); // 获取链表长度
System.out.println(list.get(0)); // 获取第一个节点的值
System.out.println(list.get(1)); // 获取第二个节点的值
System.out.println(list.get(2)); // 获取第三个节点的值

以上代码输出的结果是:

3
1
2
3

示例二

DoubleLinkedList list = new DoubleLinkedList();
list.addFirst(1); // 在头部插入节点
list.addLast(3); // 在尾部插入节点
list.add(1, 2); // 在指定位置插入节点
System.out.println(list.size()); // 获取链表长度
System.out.println(list.get(0)); // 获取第一个节点的值
System.out.println(list.get(1)); // 获取第二个节点的值
System.out.println(list.get(2)); // 获取第三个节点的值

以上代码输出的结果是:

3
1
2
3

以上就是Java数据结构之链表相关知识的总结,希望对大家有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之链表相关知识总结 - Python技术站

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

相关文章

  • Java数据结构之堆(优先队列)的实现

    Java 数据结构之堆(优先队列)的实现 什么是堆(优先队列) 堆(Heap)是一种数据结构,使用数组实现。堆分为小根堆和大根堆,大根堆满足父节点值大于子节点,小根堆则相反。堆通常被用来实现优先队列(Priority Queue)。 优先队列(Priority Queue)是一个能够让用户迅速查找到队列中最小值(或最大值)的抽象数据类型(ADT)。优先队列通…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表图解

    以下是Java数据结构之双向链表图解的完整攻略: 一、双向链表简介 1.1 定义 双向链表(Doubly Linked List),也叫双向链式线性表,是链式存储结构的基本形式之一。双向链表的每个节点都含有两个指针,分别指向前驱节点和后继节点,因此可以支持双向遍历。 1.2 结构 双向链表的结构可以用下图表示: +——-+ +——-+ +–…

    数据结构 2023年5月17日
    00
  • C++数据结构之搜索二叉树的实现

    C++数据结构之搜索二叉树的实现 搜索二叉树(Binary Search Tree, BST)是一种常见的数据结构,它支持快速地查找、插入和删除元素。本文将详细讲述如何用C++实现搜索二叉树。 一、搜索二叉树的定义 搜索二叉树是一种二叉树,它满足以下性质: 对于任意一个节点,其左子树中的所有节点都小于它,其右子树中的所有节点都大于它; 每个节点的左右子树也都…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列 什么是栈 栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。 栈的实现方式 栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java …

    数据结构 2023年5月17日
    00
  • C语言编程简单却重要的数据结构顺序表全面讲解

    C语言编程简单却重要的数据结构顺序表全面讲解 什么是顺序表? 顺序表是一种线性表,指的是一组有限元素的有限序列,其元素的逻辑顺序与它们在分配到的内存地址上的物理顺序相同或者等价。也就是说,顺序表中的元素按照其在内存中的位置依次存放。 顺序表的实现方式 顺序表的实现方式一般是使用数组,数组中的每一个元素对应着顺序表中的一个元素,位置相对应。 顺序表的优点 支持…

    数据结构 2023年5月17日
    00
  • Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)

    Java数据结构及算法实例:快速计算二进制数中1的个数 简介 本文将介绍在Java中快速计算二进制数中1的个数的算法。本算法是一种基于位运算的算法,其核心思想是利用位运算的快捷性,将原问题转化为每次计算一位是否为1的问题,使得计算速度大大提升。 背景知识 在理解本算法之前,需要了解Java中的一些背景知识: 1. 位运算 Java中的位运算符有如下几个: &…

    数据结构 2023年5月17日
    00
  • LinkedList学习示例模拟堆栈与队列数据结构

    下面是关于“LinkedList学习示例模拟堆栈与队列数据结构”的完整攻略。 什么是LinkedList? LinkedList是Java语言中的一个类,用于表示链表数据结构。链表数据结构可以根据需要进行增、删、改、查等操作,是常用的数据结构之一。 如何使用LinkedList实现堆栈? 堆栈是一种先进后出(LIFO)的数据结构,可以使用LinkedList…

    数据结构 2023年5月17日
    00
  • 使用go实现常见的数据结构

    下面我将详细讲解使用go实现常见的数据结构的完整攻略。 1. 概述 数据结构是计算机程序设计中一个非常重要的概念,常见的有数组、链表、栈、队列、树、图等。本文主要介绍如何使用Go实现常见的数据结构。 2. 数组 数组是最简单、最基本的数据结构之一,它在Go中的实现非常简单,可以用以下代码片段表示: // 定义一个长度为10的整型数组 var arr [10]…

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