No Picture say Plane!
用数组描述的链表称为静态链表,表现形式为结构体数组,包括数据域data和游标curr。
基础理解
第一幅插入元素图解分析
第二幅图删除元素图解分析
code
public class Element { public int data; public int cur; public Element(int data,int cur){ this.data = data; this.cur = cur; } }
public class StaticLinkList { //静态链表的最大长度 private int MAX_SIZE = 10; //链表的长度 private int size = 0; //静态链表头结点下标 private int head; Element[] element; public void initStaticLinkList(){ element = new Element[MAX_SIZE]; //数组下标为零的元素 当前节点为1 for(int i = 0;i < MAX_SIZE - 1;i++){ element[i] = new Element(0,i+1); } //最后一个数组元素的下标为0,表示指向当前的节点 element[MAX_SIZE - 1] = new Element(0,0); } //插入数据 public void add(int data){ if(size == 0){ head = element[0].cur; //当前结点的游标赋值给头结点 element[0].cur = element[size+1].cur; element[size+1].data = data; element[size+1].cur = element[MAX_SIZE - 1].cur; element[MAX_SIZE - 1].cur = head; size ++; } else{ //存放头结点的游标 head = element[0].cur; /*最重要的感觉莫过于这段逻辑 * 找静态链表的最后一个节点的数组下标,赋值其头结点的游标*/ int i = 1,temp; while (i < MAX_SIZE){ temp = element[i].cur; if(temp == 0) break; i++; } element[i].cur = head; //当前结点的游标赋值给头结点 element[0].cur = element[size+1].cur; element[size+1].data=data; element[size+1].cur=0; //最后一个插入节点的游标永远为0 size ++; } } public String get(int i){ //第一个元素指向备用元素的下标 return "数组的下标:" + i + " 元素的值:" + element[i].data + " 指向的备用元素的下标:" + element[i].cur; } //index是数组的下标 从1开始 public void delete(int index){ index = index + 1; if(size == 1){ //存放头结点的游标 head = element[0].cur; //获取第一个元素的下标 int i = 0; while (element[i].cur != 0){ i ++; } //第一个结点对应的下一个结点 赋值给尾结点的游标 int k = element[i].cur; element[MAX_SIZE-1].cur=k; element[i].data=0; element[i].cur=head; element[0].cur=i; size --; }else if(size < MAX_SIZE -1 && size > 0) { //存放头结点的游标 head = element[0].cur; //获取第一个元素的下标 int i = 0; while (index != element[i].cur){ i ++; } //第一个结点对应的下一个结点 赋值给尾结点的游标 int k = element[i].cur; element[MAX_SIZE-1].cur=k; element[i].data=0; element[i].cur=head; element[0].cur=i; size --; } } }
public class Demo { public static void main(String[] args){ StaticLinkList slk = new StaticLinkList(); slk.initStaticLinkList(); slk.add(5); slk.add(80); slk.add(33); slk.add(47); slk.add(11); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } System.out.println("---------------删除操作--------------------"); slk.delete(1); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } System.out.println("---------------删除第二个元素操作--------------------"); slk.delete(2); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } System.out.println("---------------删除第三个元素操作--------------------"); slk.delete(3); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } System.out.println("---------------删除第四个元素操作--------------------"); slk.delete(4); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } System.out.println("---------------删除第五个元素操作--------------------"); slk.delete(5); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } System.out.println("---------------再次插入元素--------------------"); slk.add(5); slk.add(80); slk.add(33); slk.add(47); slk.add(11); for(int i=0;i<10;i++){ System.out.println(slk.get(i)); } } }
数组的下标:0 元素的值:0 指向的备用元素的下标:6 数组的下标:1 元素的值:5 指向的备用元素的下标:2 数组的下标:2 元素的值:80 指向的备用元素的下标:3 数组的下标:3 元素的值:33 指向的备用元素的下标:4 数组的下标:4 元素的值:47 指向的备用元素的下标:5 数组的下标:5 元素的值:11 指向的备用元素的下标:0 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:1 ---------------删除操作-------------------- 数组的下标:0 元素的值:0 指向的备用元素的下标:1 数组的下标:1 元素的值:0 指向的备用元素的下标:6 数组的下标:2 元素的值:80 指向的备用元素的下标:3 数组的下标:3 元素的值:33 指向的备用元素的下标:4 数组的下标:4 元素的值:47 指向的备用元素的下标:5 数组的下标:5 元素的值:11 指向的备用元素的下标:0 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:2 ---------------删除第二个元素操作-------------------- 数组的下标:0 元素的值:0 指向的备用元素的下标:2 数组的下标:1 元素的值:0 指向的备用元素的下标:6 数组的下标:2 元素的值:0 指向的备用元素的下标:1 数组的下标:3 元素的值:33 指向的备用元素的下标:4 数组的下标:4 元素的值:47 指向的备用元素的下标:5 数组的下标:5 元素的值:11 指向的备用元素的下标:0 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:3 ---------------删除第三个元素操作-------------------- 数组的下标:0 元素的值:0 指向的备用元素的下标:3 数组的下标:1 元素的值:0 指向的备用元素的下标:6 数组的下标:2 元素的值:0 指向的备用元素的下标:1 数组的下标:3 元素的值:0 指向的备用元素的下标:2 数组的下标:4 元素的值:47 指向的备用元素的下标:5 数组的下标:5 元素的值:11 指向的备用元素的下标:0 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:4 ---------------删除第四个元素操作-------------------- 数组的下标:0 元素的值:0 指向的备用元素的下标:4 数组的下标:1 元素的值:0 指向的备用元素的下标:6 数组的下标:2 元素的值:0 指向的备用元素的下标:1 数组的下标:3 元素的值:0 指向的备用元素的下标:2 数组的下标:4 元素的值:0 指向的备用元素的下标:3 数组的下标:5 元素的值:11 指向的备用元素的下标:0 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:5 ---------------删除第五个元素操作-------------------- 数组的下标:0 元素的值:0 指向的备用元素的下标:5 数组的下标:1 元素的值:0 指向的备用元素的下标:6 数组的下标:2 元素的值:0 指向的备用元素的下标:1 数组的下标:3 元素的值:0 指向的备用元素的下标:2 数组的下标:4 元素的值:0 指向的备用元素的下标:3 数组的下标:5 元素的值:0 指向的备用元素的下标:4 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:0 ---------------再次插入元素-------------------- 数组的下标:0 元素的值:0 指向的备用元素的下标:4 数组的下标:1 元素的值:5 指向的备用元素的下标:6 数组的下标:2 元素的值:80 指向的备用元素的下标:1 数组的下标:3 元素的值:33 指向的备用元素的下标:2 数组的下标:4 元素的值:47 指向的备用元素的下标:3 数组的下标:5 元素的值:11 指向的备用元素的下标:0 数组的下标:6 元素的值:0 指向的备用元素的下标:7 数组的下标:7 元素的值:0 指向的备用元素的下标:8 数组的下标:8 元素的值:0 指向的备用元素的下标:9 数组的下标:9 元素的值:0 指向的备用元素的下标:5
耗费无数闹细胞,感觉这样容易理解