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
投稿
猜你喜欢
- 最近都在忙着写一个网站项目,今天做一个分页功能的时候,遇到了分页效果实现不了的问题,查了好久的资料,后来终于是成功解决啦,记录一下1.在po
- Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的。所以Ajax请求的页面一般
- 目录前言开始总结前言小伙伴们都知道,现在市面上最流行的web开发框架就是springboot了,在springboot开始流行之前,我们都用
- 前言之前我们在浅谈6个成员函数中有提到深浅拷贝的问题,现在再回首掏一把。一、深浅拷贝哪家强?先给出代码理一理#define _CRT_SEC
- C# 操作符之三元操作符“?:”是什么呢?C# 操作符之三元操作符“?:”有时也称为条件操作符。对条件表达式b?x:y,先计算条件b,然后进
- Android权限Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用
- 看到题目后,分析了下, 10的阶乘就已经很大了。计算出来再得到这个末尾的0的个数,完全不现实,即使实现了也是很麻烦的。后来想某个数的阶乘中乘
- 本文以一个简单实例讲述了C#装箱和拆箱操作的实现方法,简单来说装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型,是涉及栈和堆的使用
- Android:控件GridView的使用如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView
- Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的
- 本文实例为大家分享了Java实现马踏棋盘的具体代码,供大家参考,具体内容如下马在某个点最多可能有8种走法,用递归和回溯实现。注:代码中,查找
- 一般的 Executors 的 execute以及submit并发包下 Executors 创建的线程存在 一个 execute(),以及三
- 1.介绍有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntime().exec(
- 本文主要探讨以下几个问题:嵌套滑动设计目的嵌套滑动的实现嵌套滑动与事件分发机制嵌套滑动设计目的不知道大家有没有注意过淘宝APP首页的二级联动
- 目录多通道分离API操作通道合并API操作结果源码多通道分离APIpublic static void split(Mat m, List&
- flex 布局算法Flutter 弹性布局的基石 是 flex 和 flexible。理解了这两个 widget,后面的row,column
- 下面是自己写的三个方法,直接类名.方法即可调用,注意此处未做异常处理.1.下划线转驼峰 lowerLineToHump()2.首字母大写 c
- 前言Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存。Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案
- 本文实例为大家分享了C#实现围棋游戏的具体代码,供大家参考,具体内容如下之所以选择围棋作为大作业一方面是想挑战一下,另一方面是由于从6岁学围
- LinkedList<T>是一个双向链表,其元素会指向它前面和后面的元素。这样,通过移动到下一个元素可以正向遍历链表,通过移动到