Java链表LinkedList的基本概念、操作以及使用示例

server/2024/9/25 15:22:08/

在 Java 中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的引用。Java 提供了一些内置的链表实现,最常用的是 java.util.LinkedList 类。下面将详细介绍链表的基本概念、操作以及使用示例。

链表的基本概念

单向链表:每个节点只有一个指向下一个节点的引用。
双向链表:每个节点有两个引用,一个指向下一个节点,一个指向前一个节点。
循环链表链表的最后一个节点指向链表的第一个节点,形成一个环。

LinkedList 类

LinkedList 是 Java 集合框架中提供的类,实现了 List 和 Deque 接口,因此它既可以作为列表使用,也可以作为双端队列使用。LinkedList 基于双向链表实现。
主要方法

插入操作:boolean add(E e): 在链表末尾添加元素。void add(int index, E element): 在指定位置插入元素。void addFirst(E e): 在链表开头插入元素。void addLast(E e): 在链表末尾插入元素。移除操作:E remove(): 移除并返回链表的第一个元素。E remove(int index): 移除并返回指定位置的元素。boolean remove(Object o): 移除指定元素的第一次出现。E removeFirst(): 移除并返回链表的第一个元素。E removeLast(): 移除并返回链表的最后一个元素。访问操作:E get(int index): 返回指定位置的元素。E getFirst(): 返回链表的第一个元素。E getLast(): 返回链表的最后一个元素。其他操作:boolean contains(Object o): 判断链表是否包含指定元素。int size(): 返回链表的元素数量。

使用示例

以下是一些 LinkedList 的常见用法示例:

java">import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 创建一个空的链表LinkedList<String> linkedList = new LinkedList<>();// 添加元素linkedList.add("Element 1");linkedList.add("Element 2");linkedList.addFirst("First Element");linkedList.addLast("Last Element");// 访问元素System.out.println("First element: " + linkedList.getFirst()); // First ElementSystem.out.println("Last element: " + linkedList.getLast());   // Last ElementSystem.out.println("Element at index 1: " + linkedList.get(1)); // Element 1// 移除元素String firstRemoved = linkedList.removeFirst();String lastRemoved = linkedList.removeLast();String removedElement = linkedList.remove(1);// 输出移除的元素System.out.println("Removed first element: " + firstRemoved); // First ElementSystem.out.println("Removed last element: " + lastRemoved);   // Last ElementSystem.out.println("Removed element at index 1: " + removedElement); // Element 2// 遍历链表System.out.println("Remaining elements in the linked list:");for (String element : linkedList) {System.out.println(element);}}
}

自定义链表实现

如果需要更深入地理解链表结构,可以尝试自己实现一个简单的单向链表。以下是一个简单的单向链表实现:

java">class Node<T> {T data;Node<T> next;Node(T data) {this.data = data;this.next = null;}
}class CustomLinkedList<T> {private Node<T> head;private int size;CustomLinkedList() {this.head = null;this.size = 0;}public void add(T data) {Node<T> newNode = new Node<>(data);if (head == null) {head = newNode;} else {Node<T> current = head;while (current.next != null) {current = current.next;}current.next = newNode;}size++;}public T remove() {if (head == null) {return null;}T data = head.data;head = head.next;size--;return data;}public boolean contains(T data) {Node<T> current = head;while (current != null) {if (current.data.equals(data)) {return true;}current = current.next;}return false;}public int size() {return size;}public void printList() {Node<T> current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}System.out.println();}
}public class CustomLinkedListExample {public static void main(String[] args) {CustomLinkedList<Integer> list = new CustomLinkedList<>();list.add(1);list.add(2);list.add(3);list.printList(); // 1 2 3System.out.println("List contains 2: " + list.contains(2)); // truelist.remove();list.printList(); // 2 3System.out.println("List size: " + list.size()); // 2}
}

总结

LinkedList 是 Java 中一种非常灵活且易用的链表实现,适用于频繁插入和删除操作的场景。除了了解 LinkedList 的使用方法,理解链表的基本原理和自己动手实现链表也是非常有益的学习过程。根据实际需求选择合适的数据结构,可以有效提高程序的性能和可维护性。


http://www.ppmy.cn/server/101596.html

相关文章

EmguCV学习笔记 VB.Net 2.3 Mat类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

Java设计模式之策略模式实践

1、策略接口 /*** 策略接口*/ public interface DemoStrategy {Result execute(); } 2、策略工厂 /*** 策略工厂*/ Component public class DemoFactory {Resourceprivate final Map<String, DemoStrategy> demoStrategy new ConcurrentHashMap<>();public Demo…

Java版自动化测试之Selenium

1. 准备 编程语言&#xff1a;Java JDK版本&#xff1a;17 Maven版本&#xff1a;3.6.1 2. 开始 声明&#xff1a;本次只测试Java的Selenium自动化功能 本次示例过程&#xff1a;打开谷歌游览器&#xff0c;进入目标网址&#xff0c;找到网页的输入框元素&#xff0c;输入指…

使用DOM破坏启动xss

实验环境&#xff1a; Lab: Exploiting DOM clobbering to enable XSS | Web Security Academy (portswigger.net) 分析&#xff1a; 找破坏点&#xff1a; 第一个输入框可以看见是<texarrea>;不能插入语句.&#xff1a; 构造一个语句试试 <img src1 οnerrοraler…

Ruby光芒四射:开发者职业发展的璀璨之路

标题&#xff1a;Ruby光芒四射&#xff1a;开发者职业发展的璀璨之路 在软件开发的星空中&#xff0c;Ruby以其独特的魅力和强大的功能&#xff0c;成为了许多开发者的首选语言。Ruby语言以其简洁、优雅和高效著称&#xff0c;尤其是在Web开发领域&#xff0c;Ruby on Rails框…

【Qt】QWidget的geometry属性

geometry&#xff0c;意思是“几何”。可以将geometry视为是四个属性的统称。 x&#xff1a;横坐标 y&#xff1a;纵坐标 width&#xff1a;宽度 height&#xff1a;高度 API说明 geometry() 获取到控件的位置和尺⼨. 返回结果是⼀个 QRect, 包含了 x, y, width, height. 其中…

在C++中实现一个简单的机器学习算法:线性回归

在C中实现一个简单的机器学习算法&#xff1a;线性回归 引言 在现代软件开发中&#xff0c;机器学习&#xff08;ML&#xff09;已经成为一个不可或缺的工具。虽然Python是机器学习领域的主流语言&#xff0c;但C凭借其高效的性能和强大的库支持&#xff0c;也在机器学习领域…

如何用币安开放API期货监控大额订单流入或流出合约

监控大额订单流入或流出合约是区块链监控和分析中的一个重要环节&#xff0c;尤其对于交易对冲、市场操纵检测、合规性监控以及风险管理等场景至关重要。以下是一种通用的方法&#xff0c;使用C#来实现这一目标 思路&#xff1a;通过订阅Websocket流来实时获取交易信息 第一步&…