单向链表
双向链表
环形链表
//链表 //数据结构核心组成:引用+递归 //数组是一个定长的线性结构 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)]