java实现简单单链表
作者:xinan~ 发布时间:2023-10-30 09:45:46
标签:java,单链表
本文实例为大家分享了java实现简单单链表的具体代码,供大家参考,具体内容如下
一、定义:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(相当于JAVA中的引用,指示后继元素存储位置,),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
二、结构:
如图所示,data就是当前节点的数据,next是指针,指针存放的是内存地址,是当前结点的下一结点内存地址,顺着这个地址就能找到下一个结点。
三、代码实现:
package com.example.demo.linkedlist;
/**
* 结点
* Created by xinan on 2021/02/23
*/
public class Node {
public Integer value;
public Node next;
public Node(Integer value) {
this.value = value;
}
public Node(Integer value, Node next) {
this.value = value;
this.next = next;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
package com.example.demo.linkedlist;
/**
* 单链表
* Created by xinan on 2021/2/23
*/
public class SingleLinkedList {
public Node head;
/**
* 从头部添加
* @param data 待添加数据
*/
public void addHead(Integer data) {
Node node = new Node(data);
node.next = head;
head = node;
}
/**
* 从尾部添加
* @param data 待添加数据
*/
public void addLast(Integer data) {
Node node = new Node(data);
if (head == null) {
head = node;
return;
}
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = node;
}
/**
* 获取链表的长度
* @return 链表长度
*/
public Integer length() {
int length = 0;
Node temp = head;
while (temp != null) {
temp = temp.next;
length ++;
}
return length;
}
/**
* 从指定下标处添加
* @param index 指定下标
* @param data 待添加的数据
*/
public void addByIndex(int index, Integer data) {
if (index < 0 || index > length()) {
System.out.println("插入下标不合规,请检查!");
return;
}
if (index == 0) {
addHead(data);
return;
}
Node node = new Node(data);
Node temp = head;
for (int i = 1; i < index; i++) {
temp = temp.next;
}
node.next = temp.next;
temp.next = node;
}
/**
* 指定下标删除
* @param index 指定下标
*/
public void deleteByIndex(int index) {
if (index < 0 || index > length()) {
System.out.println("删除下标不合规,请检查!");
return;
}
if (index == 0) {
head = head.next;
return;
}
Node temp = head;
for (int i = 1; i < index; i++) {
temp = temp.next;
}
temp.next = temp.next.next;
}
/**
* 通过下标获取结点
* @param index 下标
* @return 结点
*/
public Node getByIndex(Integer index) {
if (index < 0 || index > length() - 1) {
System.out.println("不存在此下标结点");
}
Node temp = head;
int i = 0;
while (temp != null) {
if (i == index) {
return temp;
}
i ++;
temp = temp.next;
}
return null;
}
/**
* 打印链表值
*/
public void printLink() {
Node temp = head;
while (temp != null) {
System.out.println(temp.value);
temp = temp.next;
}
}
/**
* 打印某个节点之后的所有值
* @param node
*/
public static void printAfterNode(Node node) {
while (node != null) {
System.out.println(node.value);
node = node.next;
}
}
/**
* 清除单链表
*/
public void clearLink() {
head = null;
}
/**
* 单链表反转
* @param head 头节点
*/
public Node reverseLink(Node head) {
Node prev = null;
Node curr = head;
while (curr != null) {
Node nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
SingleLinkedList linkNode = new SingleLinkedList();
linkNode.addHead(2);
linkNode.addHead(3);
linkNode.addHead(5);
linkNode.addLast(9);
linkNode.addLast(7);
System.out.println("打印单链表: ");
linkNode.printLink();
Node byIndex1 = linkNode.getByIndex(0);
System.out.println("获取下标为1的结点值: " + byIndex1.value);
linkNode.addByIndex(2, 8);
System.out.println("下标2添加后打印单链表: ");
linkNode.printLink();
linkNode.addByIndex(0, 11);
System.out.println("下标0添加后打印单链表: ");
linkNode.printLink();
linkNode.deleteByIndex(0);
System.out.println("下标0删除后打印单链表: ");
linkNode.printLink();
Node node = linkNode.reverseLink(linkNode.head);
System.out.println("反转后打印单链表: ");
printAfterNode(node);
}
}
来源:https://blog.csdn.net/pavel101/article/details/114004379
0
投稿
猜你喜欢
- 线程状态NEW:刚创建未启动的线程RUNNABLE:正在执行状态BLOCKED:处于阻塞状态的线程WAITING:正在等待另一个线程执行特定
- 多线程的创建,方式一:继承于Thread类1.创建一个继承于Thread类的子类2.重写Thread类的run()--->将此线程执行
- 在阅读这篇文章之前,大家可以先看下《Java多线程atomic包介绍及使用方法》,了解atomic包的相关内容。一、何谓Atomic?Ato
- 需求描述:企业开发过程中,经常需要将一些静态文本数据放到Resources目录下,项目启动时或者程序运行
- 昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没
- wait(), notify(), notifyAll()等方法介绍在Object.java中,定义了wait(), notify()和no
- mysql实现配置中心本公司配置数据的管理是通过mysql进行配置管理,因为已经搭建好了,所以自己动手重新搭建一遍,熟悉整个流程。有关项目源
- 本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下1.设计内容界面中有5*10的界面,图中共有6种不同的图片,每两
- 引言:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。第1招:以空间换
- 前言由于现在网络层已经升级到RxJava2.x相关的了,所以需要做些调整。虽然RxJava1.x和RxJava2.x同属RxJava系列,但
- Executor接口基于以下方法可以完成增,删,改查以及事务处理等操作。事实上,mybatis中的所有数据库操作是通过调用这些方法实现的。p
- iText介绍和说明因为项目需要生成PDF文件,所以去找了一下能够生成PDF的Java工具,看到了iText可以说好评如潮。如果你想通过ja
- 前言Hello!上一期我大致讲解了关于Collection单列集合以及它的子接口List集合的概述、特点和遍历等,今天我为大家讲解关于Col
- 开发项目的时候,表很多,是不可能一点点的自己去写xml ,dao文件的,这里就需要用到代码的自动生成工具了。第一步:导入jar包,当然,这之
- 今天重新装了编译器,结果崩无极限,真是日了狗了了。刚刚才知道问题在哪边。好了,说正事,对于ios开发我没接触,不是很了解,百度了半天,差不多
- 最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启
- 日期和时间格式由 日期和时间模式字符串 指定。在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z'
- 本篇实例内容是关于C#读取CAD文件的,直接看代码//在不使用任务插件的情况下读取DWG文件的缩略图,以便在没有安装AutoCAD的计算机上
- 具体代码如下所示:***web.xml***<?xml version="1.0" encoding="
- Servlet 实现文件上传所谓文件上传就是将本地的文件发送到服务器中保存。例如我们向百度网盘中上传本地的资源或者我们将写好的博客上传到服务