java实现双向链表,增删改查,指定位置插入,清空链表,确认指定元素是否存在,改变指定位置内容

package www.bite.Link;


public interface Link {  //定义行为标准
void add(Object obj);//增
boolean remove(int index);//删除指定位置数据
boolean set(int index,Object obj);//改变指定位置数据
Object get(int index);//查找指定位置数据
int contains(Object obj);//确认数据是否存在
void clear();//清除
void printLink();//输出链表
int length();//计算链表长度
Object []toArray();//将链表转换成数组
boolean addAt(int index,Object obj);

}



package www.bite.Link;


class LinkImpl implements Link {  //实现接口行为
private Node first;
private Node last;
private int size = 0;


// ------------------定义链表内部内容


private class Node {
private Object data;
private Node prav;
private Node next;


public Node(Node prav, Object data, Node next) {
this.data = data;
this.prav = prav;
this.next = next;
}
}
// ----------------------------


@Override
public void add(Object obj) { // 增
Node temp = this.last;
Node newNode = new Node(temp, obj, null);
this.last = newNode;
if (this.first == null) {
this.first = newNode;
} else {
temp.next = newNode;
}
this.size++;


}


@Override
public boolean remove(int index) { // 删除指定位置数据
if(!isRight(index)) {
return false;
}
Node node=node(index);
if(node==this.first) {
if(node==this.last) {
node=null;
this.size--;
return true;
}
else {
Node temp=this.first;
this.first=node.next;
temp.next=null;
this.first.prav=null;
this.size--;
return true;
}
}
else if(node==this.last){
Node temp=this.last;
this.last=node.prav;
temp.prav=null;
this.last.next=null;
this.size--;
return true;
}
node.next.prav=node.prav;
node.prav.next=node.next;
node.prav=node.next=null;
this.size--;
return true;
}


@Override
public boolean set(int index, Object obj) { // 改变指定位置数据
if (!isRight(index)) {
return false;
}
Node node = node(index);
node.data = obj;
return true;
}


// 得到指定元素的位置
private Node node(int index) {
if (index < (size >> 1)) {
Node result = this.first;
for (int i = 0; i < index; i++) {
result = result.next;
}
return result;
}
Node result = this.last;
for (int i = size - 1; i > index; i--) {
result = result.prav;
}
return result;
}


@Override
public Object get(int index) { // 查找指定位置数据
if (!isRight(index)) {
return false;
}


return node(index).data;
}


@Override
public int contains(Object obj) { // 确认数据是否存在


if (obj == null) {
int index = 0;
for (Node node = first; node != null; node = node.next) {


if (node.data.equals(obj)) {
return index;
}
index++;
}
} else {
int index = 0;
for (Node node = first; node != null; node = node.next) {


if (node.data.equals(obj)) {
return index;
}
index++;
}

}
return -1;
}


@Override
public void clear() { // 清除
for (Node a = this.first; a != null;) {
Node b = a.next;
a.prav = a.next = null;
a = b;
}
this.size = 0;
this.first = null;
this.last = null;
}


@Override
public void printLink() { // 输出链表
Object[] result = this.toArray();
for (Object obj : result) {
System.out.println(obj);
}


}


@Override
public int length() { // 计算链表长度
return this.size;
}


@Override
public Object[] toArray() { // 将链表转换成数组
Object[] result = new Object[size];
int i = 0;
for (Node temp = first; temp != null; temp = temp.next) {
result[i++] = temp.data;
}
return result;
}


public boolean isRight(int index) {// 确认输入的数字是否合法
return index >= 0 && index < size;
}

public boolean addAt(int index,Object obj) {
if(index<0||index>size-1) {
return false;
}else if(index==0) {
Node node=node(index);
Node newnode=new Node(first, obj, node);
node.prav=newnode;
first=newnode;
}else if(index==4) {
Node node=node(index);
Node newnode=new Node(node, obj, null);
node.next=newnode;
last=newnode;
}

else {
Node node=node(index);
Node newnode=new Node(node.prav, obj, node);
node.prav.next=newnode;
node.prav=newnode;
}
this.size++;
return true;
}

}


package www.bite.Link;


public class Factory { //工厂模式,保证只new同一个对象
private Factory() {

}
public static Link getInstance() {
return new LinkImpl();

}


}

package www.bite.Link;


public class Main {
public static void main(String[] args) {
Link link=Factory.getInstance();
link.add("火车头");
link.add("车厢一");
link.add("车厢二");
link.add("车厢三");
link.add("火车尾");
//link.printLink();
link.addAt(4, "火车1");
    link.printLink();
// System.out.println("输出链表----------------");
// System.out.println(link.length());
// link.printLink();
// System.out.println("输出链表长度的测试----------------");
//
// System.out.println(link.contains("车厢一"));
// link.printLink();
// System.out.println("确认元素是否存在的测试----------------");
//
// System.out.println(link.contains("车厢9"));
// link.printLink();
// System.out.println("确认元素是否存在的测试----------------");
//
// System.out.println(link.get(2));
// link.printLink();
// System.out.println("得到指定位置元素的测试----------------");
//
// link.set(2, "车厢1");
// link.printLink();
// System.out.println("更改指定位置元素的测试----------------");
// link.clear();
// link.printLink();
// System.out.println("清除链表--------------");
}


}

你可能感兴趣的:(java实现双向链表,增删改查,指定位置插入,清空链表,确认指定元素是否存在,改变指定位置内容)