单向链表
- 如下图,data域是存放数据的,next域是存储下一个地址的指针,是链式存储的
- head头指针指向的150的地址值,通过150的地址值找到了对应的数据,在找到110的地址值,这就是链式存储
链表是以节点的方式来存储的,每个节点的data域是存储数据的,next域是指向下一个节点
链表是分为带头节点的和不带头节点的,根据实际的需求来定
- 单向链表就是一个链子,用next去关联的下一个类,知道最后一个next为null,这个就是末尾
HeadNode
package com.rj.bd.NodeLinks;
/**
* @author LXY
* @desc
* @time 2023--04--10--17:42
*/
public class HeadNode<T> {
//存放数据的排名
public Integer on;
//存放的实体数据
public T data;
//存放的下一个的索引
public HeadNode next;
public HeadNode(Integer on, T data, HeadNode next) {
this.on = on;
this.data = data;
this.next = next;
}
public HeadNode() {
}
public HeadNode(Integer on, T data) {
this.on = on;
this.data = data;
}
@Override
public String toString() {
return "HeadNode{" +
"on=" + on +
", data=" + data +
"}" ;
}
}
NodeLink
//头部信息
HeadNode<T> head=new HeadNode<T>();
//添加方法
public boolean add(int index ,T val){
//将头部信息赋给temp临时变量
HeadNode temp=head;
//循环取出列表最后一位
while (true){
if (temp.next==null){
break;
}
//如果没取到最后一位,temp向后移动,在判断
temp=temp.next;
}
//现在取到的temp是最后一位,将其赋值,就完成了尾部插入数据
temp.next=new HeadNode(index,val);
return true;
}
//遍历方法
public void getlist(){
//将头部信息赋给temp临时变量
HeadNode temp=head;
while (temp.next!=null){
System.out.println(temp.next.toString());
//如果没取到最后一位,temp向后移动,在判断
temp=temp.next;
}
}
1.1 头部添加
- 上面代码的add()是尾部添加
- 以下是尾部添加
//添加到头部
public void addhead(int index ,T val){
//将头部信息赋给temp临时变量temp存储的是原始的数据
HeadNode temp=head;
//判断是不是首行,首行的话直接赋值
if (temp.next==null){
temp.next=new HeadNode(index,val);
}else {
//实例化头部信息,接受刚刚传递的信息
HeadNode headNode = new HeadNode(index, val);
//headNode.next添加上原本的头部的next信息,赋值给哦新的headNode变量
headNode.next=temp.next;
//重新赋值给temp,这样第一个next就是刚刚插入的数据,完成了头部插入
temp.next=headNode;
}
}
完整代码
- 浅浅的封装了一下,不考虑安全优化的话,是可以使用的,写了几个实用的方法
package com.rj.bd.NodeLinks;
import lombok.SneakyThrows;
/**
* @author LXY
* @desc
* @time 2023--04--10--17:39
*/
public class NodeLink<T> {
//头部信息
HeadNode<T> head=new HeadNode<T>();
/**
* 删除数据
* @param index
*/
@SneakyThrows
public void remove(int index ){
//将头部信息赋给temp临时变量
HeadNode temp=head;
HeadNode headNode = new HeadNode();
HeadNode newHeadNode=headNode;
//角标判断
if (index>=size()){
throw new Exception("越界");
}
for (int i = 0; i <size() ; i++) {
if (i==index){
//后移,一直找到数据
temp=temp.next;
continue;
}else {
if (temp.next==null){
break;
}else {
newHeadNode.next=new HeadNode(temp.next.on,temp.next.data);
newHeadNode=newHeadNode.next;
}
//后移,一直找到数据
temp=temp.next;
}
}
head=headNode;
}
/**
* 获取数据个数
* @return
*/
public Integer size(){
//将头部信息赋给temp临时变量
HeadNode temp=head;
int count =0;
while (true){
if (temp.next!=null){
count++;
}else {
break;
}
temp=temp.next;
}
return count;
}
/**
* 通过下标查询数据
* @param index 索引
* @return
*/
@SneakyThrows
public HeadNode get(int index){
//将头部信息赋给temp临时变量
HeadNode temp = head;
HeadNode headNode = new HeadNode();
//角标判断
if (index>=size()){
throw new Exception("越界");
}
//循环到最后一个temp
for (int i = 0; i <=index; i++) {
temp=temp.next;
//最后一个temp就是想要的数据
if (i==index){
//返回
headNode.on=temp.on;
headNode.data=temp.data;
}
}
return headNode;
}
/**
* 添加数据到尾部
* @param index
* @param val
* @return
*/
public boolean add(int index ,T val){
//将头部信息赋给temp临时变量
HeadNode temp=head;
//循环取出列表最后一位
while (true){
if (temp.next==null){
break;
}
//如果没取到最后一位,temp向后移动,在判断
temp=temp.next;
}
//现在取到的temp是最后一位,将其赋值,就完成了尾部插入数据
temp.next=new HeadNode(index,val);
return true;
}
/**
* 添加数据到头部
* @param index
* @param val
*/
public void addhead(int index ,T val){
//将头部信息赋给temp临时变量temp存储的是原始的数据
HeadNode temp=head;
//判断是不是首行,首行的话直接赋值
if (temp.next==null){
temp.next=new HeadNode(index,val);
}else {
//实例化头部信息,接受刚刚传递的信息
HeadNode headNode = new HeadNode(index, val);
//headNode.next添加上原本的头部的next信息,赋值给哦新的headNode变量
headNode.next=temp.next;
//重新赋值给temp,这样第一个next就是刚刚插入的数据,完成了头部插入
temp.next=headNode;
}
}
/**
* 遍历全部数据输出
*/
public void getlist(){
//将头部信息赋给temp临时变量
HeadNode temp=head;
while (temp.next!=null){
System.out.println(temp.next.toString());
//如果没取到最后一位,temp向后移动,在判断
temp=temp.next;
}
}
}