public class ChainTable {
private Node firstNode;//第一个节点
private Node lastNode;//最后一个节点
private int size;//链表中含有的元素个数
public int size(){//返回链表中含有的元素个数
return size;
}
//添加一个节点
public void add(Object obj){
if(size == 0){//当添加的节点为第一个节点的时候
Node node = new Node();
node.setObj(obj);
lastNode = node;
firstNode = node;
firstNode.setNextNode(lastNode);
lastNode.setNextNode(null);
size++;
}else{
Node node = new Node();
node.setObj(obj);
lastNode.setNextNode(node);
lastNode = node;
size++;
}
}
//添加一个链表
public void add(ChainTable table) throws Exception{
if(table != null){
for(int i=0;i<table.size();i++){
this.add(table.get(i));
}
}
}
//获取所在索引的节点中的值
public Object get(int index) throws Exception{
return getNode(index).getObj();
}
//获得对应索引的节点
private Node getNode(int index) throws Exception{
//让node 指向第一个节点
Node node = firstNode;
//保证index在正常区间内
if(index < 0 || index >= size){
throw new Exception();
}else{
for(int i=0;i<index;i++){
node = node.getNextNode();
}
}
return node;
}
//删除所在索引的值
public void remove(int index) throws Exception {
if(index < 0 | index >=size){
throw new Exception();
}
if(index == 0){
firstNode = firstNode.getNextNode();
}else if (index == (size -1)){
Node upNode = getNode(size -2);
lastNode = upNode;
}else{
Node upNode = getNode(index - 1);
Node node = upNode.getNextNode();
Node nextNode = node.getNextNode();
upNode.setNextNode(nextNode);
node = null;
}
size--;
}
//判断是否包含某个元素
public boolean contain(Object obj) throws Exception{
return indexOf(obj) >= 0;
}
//返回obj的索引 若没有此元素 则返回-1
public int indexOf(Object obj) throws Exception{
int index = -1;
if(obj == null){
for(int i=0;i<size - 1;i++){
if(get(i) == null){
index = i;
break;
}
}
}else{
for(int i=0;i<size -1;i++){
if(get(i).equals(obj)){
index = i;
break;
}
}
}
return index;
}
//内部类Node
public class Node{
private Object obj;//数据域
private Node nextNode;//指针域 指向下一个节点
public Node(){//构造方法
}
public Node(Object obj,Node nextNode){//构造方法
this.obj = obj;
this.nextNode = nextNode;
}
public Object getObj() {//获取数据
return obj;
}
public void setObj(Object obj) {//设置数据
this.obj = obj;
}
public Node getNextNode() {//获得下一个节点
return nextNode;
}
public void setNextNode(Node nextNode) {//设置下一个节点
this.nextNode = nextNode;
}
}
}