Java中 链表的基础知识介绍

        在 Java 中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向链表中下一个节点的引用。链表不同于数组,它不要求在内存中连续存储,这使得链表在内存分配和动态扩展方面更加灵活。


         基础概念
        节点(Node)
链表中的每个节点包含两个主要元素:数据(通常称为“值”)和指向链表中下一个节点的引用(也称为“指针”或“链接”)。在 Java 中,节点通常是一个自定义的类实例。


class Node {int data;Node next;public Node(int data) {this.data = data;this.next = null;}
}


        单向链表
单向链表是最简单的链表类型,其中每个节点只包含指向下一个节点的引用。
        双向链表
双向链表每个节点除了包含指向下一个节点的引用外,还包含一个指向前一个节点的引用。
        循环链表
循环链表是一种特殊的链表,其中最后一个节点的“下一个”引用指向第一个节点,形成一个环。
        常用方法
        创建链表


public class LinkedListExample {public static void main(String[] args) {Node head = new Node(1);head.next = new Node(2);head.next.next = new Node(3);head.next.next.next = new Node(4);}
}


        遍历链表


public void printList(Node node) {while (node != null) {System.out.print(node.data + " ");node = node.next;}System.out.println();
}


        查找节点


public Node find(Node head, int key) {Node current = head;while (current != null) {if (current.data == key) {return current;}current = current.next;}return null;
}


        插入节点


public void insertAtBeginning(Node newNode) {newNode.next = head;head = newNode;
}


        删除节点


public void deleteNode(Node head, int key) {if (head == null) {return;}if (head.data == key) {head = head.next;return;}Node current = head;while (current.next != null) {if (current.next.data == key) {current.next = current.next.next;return;}current = current.next;}
}


        反转链表


public Node reverseList(Node head) {Node prev = null;Node current = head;Node next = null;while (current != null) {next = current.next;current.next = prev;prev = current;current = next;}return prev;
}


        查找中间节点


public Node findMiddleNode(Node head) {if (head == null) {return null;}Node slow = head;Node fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;
}


        完整示例
下面是一个完整的 Java 链表示例,包括创建、遍历、插入、删除和反转链表的方法。


public class LinkedListExample {public static void main(String[] args) {LinkedListExample list = new LinkedListExample();list.insertAtBeginning(new Node(1));list.insertAtBeginning(new Node(2));list.insertAtBeginning(new Node(3));System.out.println("原始链表:");list.printList(list.head);list.deleteNode(list.head, 2);System.out.println("删除节点 2 后的链表:");list.printList(list.head);list.head = list.reverseList(list.head);System.out.println("反转后的链表:");list.printList(list.head);}Node head;public void insertAtBeginning(Node newNode) {newNode.next = head;head = newNode;}public void printList(Node node) {while (node != null) {System.out.print(node.data + " ");node = node.next;}System.out.println();}public void deleteNode(Node head, int key) {if (head == null) {return;}if (head.data == key) {head = head.next;return;}Node current = head;while (current.next != null) {if (current.next.data == key) {current.next = current.next.next;return;}current = current.next;}}public Node reverseList(Node head) {Node prev = null;Node current = head;Node next = null;while (current != null) {next = current.next;current.next = prev;prev = current;current = next;}return prev;}
}


        在这个例子中,我们创建了一个 `LinkedListExample` 类,它包含一个 `head` 属性来存储链表的头节点。我们定义了几个方法来操作链表,包括插入节点到链表的开始、打印链表、删除节点和反转链表。
        总结
        Java 中的链表是一种灵活且常用的数据结构,适用于需要动态内存分配和扩展的场景。通过使用节点和引用,链表可以在内存中以非连续的方式存储数据,这使得它在处理大量数据时比数组更加高效。在实际应用中,理解和掌握链表的相关操作对于解决各种问题非常重要。通过练习和实际应用,你可以更好地理解链表的工作原理和如何在 Java 中有效地使用它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7磁盘管理,lvm挂载、扩容

一、centos7 磁盘挂载 默认盘符格式 centos7 默认文件格式xfscentos6 默认文件格式ext4centos5 默认文件格式ext3 1、/dev/vdb和/dev/mapper/lvm-data对比 1)/dev/vdb /dev/vdb通常表示一个裸的块存储设备,比如一个硬盘或者虚拟机中的一个虚拟硬盘。…

软件测试之学习测试用例的设计(等价类法、边界值法、错误猜测法、场景法、因果图法、正交法)

1. 测试用例的概念 软件测试人员向被测试系统提供的一组数据的集合,包括 测试环境、测试步骤、测试数据、预期结果 2. 为什么在测试前要设计测试用例 测试用例是执行测试的依据 在回归测试的时候可以进行复用 是自动化测试编写测试脚本的依据 衡量需求的覆盖率…

【Java】常用类和基础API

文章目录 一、String的特性二、String的内存结构2.1 拼接2.2 new 三、String的常用API-13.1 构造器 四、String的常用API-24.1 常用方法4.2 查找4.3 字符串截取4.4 和字符/字符数组相关4.5 开头与结尾4.6 替换 五、StringBuffer、StringBuilder5.1 StringBuilder、StringBuffer…

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时,会报SSH漏洞风险提醒,具体如下: 针对这些漏洞,可以关闭SSH服务(前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下,此时可以通过VNC远程登录方法&#x…

简单的网页制作

1网页编写格式 <!DOCTYPE html> <html><head><meta charset"utf-8"> <title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html>2标签 在body内<h1></h1&…

3D Occupancy 预测冠军方案:FB-OCC

文章结尾有视频和连接 背景知识 Occupancy 更像是一个语义分割任务&#xff0c;但是它是 3D 空间的语义分割它的我们对 Occupancy 分自己的期望是它能够具有通用的这种目标建模的能力&#xff0c;才能够不是不受制于这种目标框这种几何的矩形的这种约束而能够建模任意形状的这…

图像去噪--(1)

系列文章目录 文章目录 系列文章目录前言一、图像噪声1.1 噪声定义1.2 基本特征 二、按照噪声概率分布分类1.高斯噪声2.泊松噪声 三、去噪算法3.1 线性滤波3.1.1 高斯滤波3.1.2 均值滤波 3.2 非线性滤波3.2.1 中值滤波3.2.2 双边滤波 四、深度学习总结 前言 一、图像噪声 1.1 …

加密算法详解

加密学的发展和应用 计算机加密学的发展历程可以大致分为以下几个阶段&#xff1a; 古典密码学时期&#xff08;古代至20世纪初&#xff09;&#xff1a; 在古代&#xff0c;人们就已经开始使用简单的加密技术来保护通信内容&#xff0c;例如凯撒密码、维吉尼亚密码等。到了近…

2024年【天津市安全员C证】新版试题及天津市安全员C证模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证新版试题考前必练&#xff01;安全生产模拟考试一点通每个月更新天津市安全员C证模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过天津市安全员C证模拟考试题库很简单。 1、【多选题】《…

Linux安装使用one-api 格式访问所有的大模型

One API ✨ 通过标准的 OpenAI API 格式访问所有的大模型&#xff0c;开箱即用 ✨ [!NOTE] 本项目为开源项目&#xff0c;使用者必须在遵循 OpenAI 的使用条款以及法律法规的情况下使用&#xff0c;不得用于非法用途。 根据《生成式人工智能服务管理暂行办法》的要求&#xff…

主干网络篇 | YOLOv8更换主干网络之ShuffleNetV2(包括完整代码+添加步骤+网络结构图)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ShuffleNetV2是一种轻量级的神经网络架构&#xff0c;用于图像分类和目标检测任务。它是ShuffleNet的改进版本&#xff0c;旨在提高模型的性能和效率。ShuffleNetV2相比于之前的版本&#xff0c;在保持模型轻量化的同时&am…

inux(CentOS)/Windows-C++ 云备份项目(项目文件操作工具类设计,完成项目基本文件操作-读写-压缩-目录操作)

文章目录 1. 项目文件操作工具类设计 1. 项目文件操作工具类设计 根据前面的分析&#xff0c;这个文件类的基本属性如下&#xff1a; 文件大小信息文件最后修改时间文件最后一次访问时间&#xff0c;方便文件的热点管理文件名称&#xff0c;需要从http 请求行上的uri中获取基…