版本3将采用内部类的方式实现单链表,这样有两大好处,第一:封装;第二:更加贴合面向对象的思想。在链表类Link里面定义一个Node结点类,Node负责创建结点并且执行结点内部的相关操作,链表类负责执行对结点的相关操作。代码如下:
Link类:
1 import java.net.Inet4Address; 2 /** 3 *这是一个链表类,结点类写在链表类的内部就更加贴合面向对象的思想(链表是由一个个结点组成的),这个类的作用是操作结点, 4 *定义了操作结点的一些方法 5 */ 6 public class Link { 7 8 private Node root;//设置头结点,头指针存放的下一个结点的地址 9 private int count=0;//用于计算链表长度 10 private int index=0;//定义的下标 11 private String[] returnArray;//定义一个数组用来输出链表数据 12 13 public String[] toArray() { 14 if (this.root==null) { 15 return null; 16 } 17 this.index=0; 18 this.returnArray=new String[this.count]; 19 this.root.toArrayNode(); 20 return this.returnArray; 21 } 22 23 //删除方法 24 public void remove(String data) { 25 if (this.contains(data)) { 26 if (data.equals(this.root.data)) { 27 this.root=this.root.next; 28 } 29 }else { 30 this.root.next.removeNode(this.root, data); 31 //此时下一个结点的上一个节点就是this。root 32 }this.count--; 33 } 34 35 //修改方法 36 public void set(int index,String data) { 37 if(index>(this.count-1)||index<0) { 38 return ; 39 } 40 this.index=0; 41 this.root.setNode(index,data); 42 } 43 44 /** 45 * *获取结点信息 46 */ 47 public String get(int index) { 48 if(index>(this.count-1)||index<0) { 49 return null; 50 } 51 this.index=0; 52 return this.root.getNode(index); 53 } 54 55 /** 56 **设置指针结点方法 57 */ 58 public void setIndex(int index) { 59 this.index = index; 60 } 61 62 //返回链表长度 63 public int size() { 64 return this.count; 65 } 66 67 //判断链表是否为空 68 public boolean isEmpty() { 69 return this.count==0; 70 } 71 72 73 //调用结点类中的方法containsNode,根据传入的数据判断是否存在 74 public boolean contains(String data) { 75 if(data==null||this.root==null) { 76 return false; 77 } 78 return this.root.containsNode(data); 79 } 80 81 public Link() { 82 } 83 //调用结点类中的方法增加结点 84 85 //要注意增加结点这一块,是针对这一个结点的操作,所以只考虑这一个结点 86 public void add(String data) { 87 if(data==null) { 88 return; 89 } 90 Node node=new Node(data); 91 this.count++;//Node创建出来count就++ 92 93 if(this.root==null) { 94 this.root=node; 95 }else { 96 this.root.addNode(node); 97 } 98 99 } 100 101 102 //****************************************************************** 103 /** 104 **这是一个结点类,这个类的作用是创建一个个结点 105 */ 106 private class Node{ 107 private String data; 108 private Node next; 109 110 //有参构造 111 public Node(String data) { 112 this.data = data; 113 } 114 115 //无参构造 116 public Node() { 117 } 118 119 120 /** 121 * 将链表数据变成数组输出 122 */ 123 public void toArrayNode() { 124 Link.this.returnArray[Link.this.index++]=this.data; 125 if (this.next!=null) { 126 this.next.toArrayNode(); 127 } 128 129 } 130 131 //第一次调用(link) previous=this.root;this=Link.root.next 132 //第二次调用(Node) previous=this.root.next;this=Link.root.next.next.next 133 public void removeNode (Node previous,String data) { 134 if(this.data.equals(data)) { 135 previous.next=this.next; 136 137 }else { 138 this.next.removeNode(previous, data);//this.next的父节点就是this 139 } 140 141 } 142 143 /** 144 * *设置结点信息方法 145 */ 146 public void setNode(int index, String data) { 147 if(Link.this.index++ ==index) { 148 this.data=data; 149 }else { 150 this.next.setNode(index,data); 151 } 152 } 153 154 /** 155 ** 获取结点信息方法 156 */ 157 public String getNode(int index) { 158 if(Link.this.index++ ==index) { 159 return this.data; 160 }else { 161 return this.next.getNode(index); 162 } 163 } 164 165 /** 166 * *查找方法,判断数是否存在 167 */ 168 public boolean containsNode(String data) { 169 if(data.equals(this.data)) { 170 return true; 171 }else { 172 if(this.next !=null) { 173 return this.next.containsNode(data); 174 }else { 175 return false; 176 } 177 } 178 179 } 180 /** 181 * 增加结点 182 */ 183 //第一次调用(Link):this=Link.root 184 //第二次调用(Node):this=Link.root.next 185 186 //这里要重点理解指针,首先要明白指针是会移动的,当判断this.next是否为空的时候,指针已经移动到下一个结点了,next存放的是下一个结点的地址。 187 public void addNode(Node node) { 188 if(this.next==null) { 189 this.next=node; 190 }else { 191 this.next.addNode(node); 192 } 193 } 194 195 public String getData() { 196 return data; 197 } 198 199 public void setData(String data) { 200 this.data = data; 201 } 202 203 public Node getNext() { 204 return next; 205 } 206 207 public void setNext(Node next) { 208 this.next = next; 209 } 210 } 211 }
LinkeText类:
package lianbiaoDemo03; public class LinkText { public static void main(String[] args) { Link link=new Link(); link.add("葫芦娃1"); link.add("葫芦娃2"); link.add("葫芦娃3"); link.add("葫芦娃4"); link.add("葫芦娃5"); // System.out.println(link.size()); // System.out.println(link.isEmpty()); // System.out.println(link.contains("葫芦娃4")); // System.out.println(link.get(1)); // link.set(1, "孙悟空"); // System.out.println(link.get(1)); // link.remove("葫芦娃3"); // System.out.println(link.get(2)); String [] s=link.toArray(); for (int i = 0; i < s.length; i++) { System.out.println(s[i]); } } }