1、定义接口Link:
public interface Link {
void add(Object obj); //增加节点
boolean remove(int index); //删除指定节点
boolean set(int index,Object obj); //修改节点
Object get(int index); //查询指定节点
void printLink(); //打印链表
Object[] toArray(); //将链表节点内容存入数组
int getSize(); //得到链表大小
void clear(); //清空链表
int contains(Object obj); //判断obj是否存在于链表
}
2、定义LinkImpl类实现Link接口
public class LinkImpl implements Link {
private Node first;
private Node last;
private int size;
//--------------------------
private class Node{
private Node prev;
private Object data;
private Node next;
public Node(Node prev,Object data,Node next){
this.prev = prev;
this.data = data;
this.next = next;
}
}
//--------------------------
@Override
public void add(Object obj) {
Node lastNode = last;
Node newNode = new Node(lastNode, obj, null);
last = newNode;
if(first == null) {
first = newNode;
}else {
lastNode.next = newNode;
}
size++;
}
@Override
public boolean remove(int index) {
// TODO Auto-generated method stub
if(index < 0 || index >= size) {
return false;
}
else if(index == 0) {
if(size == 1) {
Node node = first;
node = null;
first = null;
last = null;
size--;
}
else {
Node node = node(index);
first = node.next;
node.next.prev = null;
node = null;
size--;
}
}else if(index == size - 1) {
Node node = node(index);
last = node.prev;
node.prev.next = null;
node = null;
size--;
}else {
Node node = node(index);
node.prev.next = node.next;
node.next.prev = node.prev;
node = null;
size--;
}
return true;
}
@Override
public boolean set(int index, Object obj) {
if(index < 0 || index >= size) {
return false;
}
Node node = node(index);
node.data = obj;
return true;
}
private Node node(int index) {
if(index < (size >> 1)) {
Node temp = first;
for(int i = 0;i < index;i++) {
temp = temp.next;
}
return temp;
}else {
Node temp = last;
for(int i = size - 1;i > index;i--) {
temp = temp.prev;
}
return temp;
}
}
@Override
public Object get(int index) {
// TODO Auto-generated method stub
if(index < 0 || index >= size) {
return null;
}
Object[] arr = toArray();
return arr[index - 1];
}
@Override
public void printLink() {
Object[] arr = toArray();
for(int i = 0;i < size;i++) {
System.out.println(arr[i]);
}
}
@Override
public Object[] toArray() {
Object[] arr = new Object[size];
int i = 0;
for(Node node = first;node != null;node = node.next) {
arr[i++] = node.data;
}
return arr;
}
@Override
public int getSize() {
return size;
}
@Override
public void clear() {
Node rubbish;
for(Node node = first;node != null;node = rubbish) {
node.prev = null;
node.data = 0;
rubbish = node.next;
node.next = null;
}
first = null;
last = null;
size = 0;
}
@Override
public int contains(Object obj) {
int index = 0;
for(Node node = first;node != null;node = node.next) {
if(node.data == obj) {
return index + 1;
}
index++;
}
return -1;
}
}
3、定义Factory类得到LinkImpl类的一个对象
public class Factory {
private Factory() {
};
public static Link getLinkInstance() {
return new LinkImpl();
}
}
4、用户端测试类
public class Test {
public static void main(String[] args) {
Link link = Factory.getLinkInstance();
link.add("火车头");
link.add("车厢1");
link.add("车厢2");
link.add("车厢3");
link.add("车尾");
link.printLink();
link.set(2, "VIP车厢");
System.out.println("*******************");
link.printLink();
System.out.println("*******************");
System.out.println(link.get(3));
System.out.println("*******************");
System.out.println(link.contains("车厢3"));
System.out.println(link.contains("车厢三"));
System.out.println("*******************");
System.out.println(link.getSize());
System.out.println("*******************");
link.clear();
link.printLink();
System.out.println("*******************");
System.out.println(link.getSize());
link.remove(4);
link.printLink();
}
}
测试结果:
火车头
车厢1
车厢2
车厢3
车尾
*******************
火车头
车厢1
VIP车厢
车厢3
车尾
*******************
VIP车厢
*******************
4
-1
*******************
5
*******************
*******************
0
完!