java实现简单单链表
作者:xinan~ 时间:2023-10-30 09:45:46
本文实例为大家分享了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
标签:java,单链表
0
投稿
猜你喜欢
Java毕业设计实战项目之宠物商城系统的实现流程
2022-03-02 06:10:41
Java微信公众平台开发(11) 微信三大平台的关联
2022-10-15 06:55:56
深入JAVA对象深度克隆的详解
2022-01-05 14:03:13
Java nacos动态配置实现流程详解
2021-06-04 19:18:30
解析Java的Hibernate框架中的持久化类和映射文件
2023-08-19 15:00:05
Android微信右滑退出功能的实现代码
2021-12-26 07:15:48
Linux环境g++编译GDAL动态库操作方法
2022-02-23 09:41:45
Java多线程编程之ThreadLocal线程范围内的共享变量
2022-03-10 00:41:05
VC对自定义资源加密解密(AES)的详解
2023-01-10 00:27:15
详解Java中字符流与字节流的区别
2023-01-14 00:19:58
详解Flutter和Dart取消Future的三种方法
2022-10-15 12:44:16
Android编程实现播放视频的方法示例
2023-04-20 06:34:17
Android实现遮罩层(蒙板)效果
2023-04-26 18:43:03
浅谈Java后台对JSON格式的处理操作
2023-02-16 07:28:36
Android自定义水波纹底部导航的实现
2022-08-23 13:12:35
Spring Security保护用户密码常用方法详解
2023-01-24 17:06:18
Android开发中解析xml文件XmlUtils工具类与用法示例
2023-03-26 01:05:45
Java 常见的限流算法详细分析并实现
2022-01-05 22:11:09
C#计算器编写代码
2022-12-28 02:57:25
ShardingSphere jdbc实现分库分表核心概念详解
2023-11-24 12:09:45