链表(单向链表的建立、删除、插入、打印)
1、链表一般分为:
单向链表
双向链表
环形链表
//链表
//数据结构核心组成:引用+递归
//数组是一个定长的线性结构
class Node{//只有node类才可以在保存数据的同时设置数据的先后关系
private Object data ;//真正要保存的数据
private Node next ;//定义下一个节点
//node类的核心作用在于保存数据和连接节点关系
public Node(Object data){ //车厢里面一定要去保存有数据
this.data = data;
}
public void setData(Object data){
this.data = data;
}
public Object getData(){
return this.data;
}
public void setNext(Node next){
this.next = next;
}
public Node getNext(){
return this.next;
}
}
public class Day15 {
public static void main(String[] args) throws Exception{
//1、封装几个节点
Node root = new Node("火车头");//现在假设存放的数据是string
Node n1 = new Node("车厢A");
Node n2 = new Node("车厢B");
Node n3 = new Node("车厢C");
//2、需要设置节点的关系
root.setNext(n1);
n1.setNext(n2);
n2.setNext(n3);
//3、输出节点
print(root);
}
public static void print(Node node){
if (node != null){//表示当前存在有节点
System.out.println(node.getData());
print(node.getNext());//继续向下取出
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYaWQvGv-1633234349366)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210926195816584.png)]
数据的存储和返回
class Link{ //负责链表的操作
//将Node定义为内部类,表示Node类只为Link类服务
private class Node{ //负责数据与节点关系的匹配
private Object data ; //保存节点的数据
private Node next ; //保存下一个节点
public Node(Object data){
this.data = data ;
}
//第一次调用:this = Link.root
//第二次调用:this = Link.root.next
//第三次调用:this = Link.root.next.next
public void addNode(Node newNode){//处理节点关系
if (this.next == null) {//当前节点下一个为空,表示可以保存
this.next = newNode;
}else { //现在当前节点的下一个不为空
this.next.addNode(newNode);
}
}
//第一次调用:this = Link.root
//第二次调用:this = Link.root.next
public void toArrayNode(){
Link.this.retData[Link.this.foot++] = this.data;
if (this.next != null){ //现在还有下一个节点
this.next.toArrayNode();
}
}
}
//--------------以下为Link类定义-------------------
private Object[] retData;//返回类型
private int foot = 0;//操作脚标
private int count = 0;//当前的保存个数
private Node root;//属于根节点,没根节点无法进行数据的保存,存第一个节点
public void add(Object data){
if (data == null){ //人为的追加了规定,不允许存放空值
return; //方法结束调用
}
//如果要进行数据的保存,那么必须将数据封装在Node节点
//如果没有封装,则无法确认好节点的先后顺序
Node newNode = new Node(data);
if (this.root == null){ //当前并没有根节点
this.root = newNode ; //第一个节点设置为根节点
}else { //根节点已经存在了
this.root.addNode(newNode);
}
this.count++;//数据累加处理
}
public int size(){ //取得元素个数
return this.count ;
}
public boolean isEmpty(){//判断是否为空
return this.root == null && this.count == 0 ;
}
public Object[] toArray(){
if (this.count==0){
return null ;
}
//现在链表中存在数据,则将开辟指定长度的数组
//该数组一定要交给Node类进行处理。
this.retData = new Object[this.count];
this.foot = 0;//进行清零的处理,需要进行脚标的操作
this.root.toArrayNode();//将数据的取出处理交给Node类完成
return this.retData;
}
}
public class Test24 {
public static void main(String[] args) {
Link all = new Link();
System.out.println(all.size()+"="+all.isEmpty());
all.add("hello");
all.add("world");
all.add("hehao");
System.out.println(all.size()+"="+all.isEmpty());
Object result [] = all.toArray();
for (int x = 0;x< result.length;x++){
System.out.println(result[x]);
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVQHKxsh-1633234349368)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210926195748128.png)]
x = 0;x< result.length;x++){
System.out.println(result[x]);
}
}
}
[外链图片转存中...(img-wVQHKxsh-1633234349368)]