采菊大侠
2016-12-06 14:00:42浏览 3460
//可用链表,链表的基本实现
class Link{//链表类,外部能看到的只有这一个类
private class Node{//创建内部类
private String data;//保存数据
private Node next;//保存下一个节点
public Node(String data){
this.data = data;
}
public void addNode(Node newNode){
if(this.next == null){//当前的下一个节点为空
this.next = newNode;//保存节点
}else{ //向后继续保存
this.next.addNode(newNode);
}
}
//第一次是由Link类调用 this = Link.root
//第二次是由Node类自己调用 this = Link.root.next
public boolean containsNode(String data){
if(data.equals(this.data)){//找到数据
return true;//后面不在查询
}else{ //当前节点数据不满足查询
if(this.next != null){//有后续节点时
//继续向后查询 递归调用
return this.next.containsNode(data);
}else{//没有后续节点
return false;//没得查了直接返回false
}
}
}
public String getNode(int index){
if(Link.this.foot++ == index){//找到要查找的索引时
return this.data;//返回当前节点数据
}else{//继续向后查询
return this.next.getNode(index);
}
}
public void setNode(int index,String data){
if(Link.this.foot++ == index){
this.data = data;
}else{
this.next.setNode(index,data);
}
}
public void removeNode(Node previous,String data){
if(data.equals(this.data)){ //当前节点为要删除的节点
previous.next = this.next;
}else{ //往后继续查询
this.next.removeNode(this,data);
}
}
public void toArrayNode(){
//将数据逐个保存到数组toArray[]里面
Link.this.retArray[Link.this.foot++] = this.data;
if(this.next != null){ // 有后续节点
this.next.toArrayNode(); //实现逐个保存
}
}
}
//============================以上为内部类==================
private Node root;//需要根节点
private int foot = 0;
private int count = 0;
private String[] retArray;
public void add(String data){//1.增加数据
if(data == null){
return;
}
Node newNode = new Node(data);
if(this.root == null){//
this.root = newNode;
}else{//存在根节点,那么其他节点交给Node类处理
this.root.addNode(newNode);//
}
this.count++;//每次保存完成后数据加1
}
public int size(){//2.取得链表长度
return this.count;//返回保存元素的个数
}
public boolean isEmpty(){//3.判断是否为空链表
return this.count == 0;
}
public boolean contains(String data){//4.查询数据
//要查的数据为空且根元素没有数据
if(data == null ||this.root == null){
return false; //没有查询结果
}
return this.root.containsNode(data);//交给Node类处理
}
public String get(int index){//5.根据索引取得数据
if(index >= this.count){//超过搜索范围
return null;
}else{//在搜索范围内
this.foot = 0;//初始化 方便再次查询
return this.root.getNode(index);//交给Node类处理
}
}
public void set(int index,String data){//6.修改指定索引的内容
if(index > this.count){//超过索引范围
return;//结束方法调用
}
this.foot = 0;//重新设置foot属性作为索引出现
this.root.setNode(index,data);//交给Node类设置数据
}
public void remove(String data){//7.删除指定内容/数据
if(this.contains(data)){
if(data.equals(this.root.data)){//要删除的是根节点
this.root = this.root.next;
}else{ //不是根节点
this.root.next.removeNode(this.root,data);
}
this.count--;//每删除一次,长度减1
}
}
public String[] toArray(){//8.将链表以对象数组返回
if(this.root == null){
return null;
}else{
this.foot = 0; //需要角标控制
this.retArray = new String[this.count]; //根据来保存内容开辟数组
this.root.toArrayNode(); //交给Node类处理
return this.retArray;
}
}
}
//main方法=====================================
public class Linked{
public static void main(String[] args){
Link all = new Link();
all.add("a");
all.add("b");
all.add("c");
all.add("e");
String [] data = all.toArray();
for(int i = 0;i < data.length;i++){
System.out.println(data[i]);
}
}
}