源码
package firstuse;
interface ILink {
boolean add(Object data);
int contains(Object data);
boolean remove(Object data);
Object set(int index,Object newData);
Object get(int index);
void clear();
Object[] toArray();
int size();
void printLink();
}
class LinkImpl implements ILink{
private Node first;
private Node last;
private int size = 0;
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;
}
}
public boolean add(Object data) {
Node newNode = new Node(this.last,data,null);
if(this.first == null){
this.first = newNode;
}
else{
this.last.next = newNode;
}
this.last = newNode;
this.size++;
return true;
}
@Override
public int contains(Object data) {
int index = 0;
if(data == null){
for(Node temp=first; temp!=null; temp=temp.next){
if(temp.data == null){
return index;
}
index++;
}
return -1;
}
for(Node temp=first; temp!=null; temp=temp.next) {
if(data.equals(temp.data)){
return index;
}
index++;
}
return -1;
}
@Override
public boolean remove(Object data) {
if(data == null){
for(Node temp=first; temp!=null; temp=temp.next){
if(temp.data == null){
unLink(temp);
return true;
}
}
return false;
}
for(Node temp=first; temp!=null; temp=temp.next){
if(data.equals((temp.data)){
unLink(temp);
return true;
}
}
return false;
}
@Override
public Object set(int index, Object newData) {
if(!isLinkIndex(index)){
return false;
}
Node node = node(index);
Object element = node.data;
node.data = newData;
return element;
}
@Override
public Object get(int index) {
if(isLinkIndex(index)){
return node(index).data;
}
return null;
}
@Override
public void clear() {
for(Node temp=first; temp!=null;){
temp.data = null;
Node node = temp.next;
temp.prev = temp.next = null;
temp = node;
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;
}
@Override
public int size() {
return this.size;
}
@Override
public void printLink() {
Object[] data = this.toArray();
for(Object temp:data){
System.out.println(temp);
}
}
private Node node(int index) {
if(index<(size>>1)){
Node temp = first;
for(int i=0; i<index; i++){
temp = temp.next;
}
return temp;
}
Node temp = last;
for(int i=size-1; i>index; i--){
temp = temp.prev;
}
return temp;
}
private boolean isLinkIndex(int index){
return (index>=0) && (index<size);
}
private Object unLink(Node node){
Object elementData = node.data;
Node prev = node.prev;
Node next = node.next;
if(prev != null){
prev.next = next;
node.prev = null;
}
else{
this.first = next;
}
if(next != null){
next.prev = prev;
node.next = null;
}
else{
this.last = prev;
}
this.size--;
return elementData;
}
}
public class Test1 {
public static void main(String[] args) {
ILink link = new LinkImpl();
link.add("火车头");
link.add("车厢1");
link.add("车厢2");
link.add("火车尾");
link.printLink();
Object a = link.get(2);
System.out.println(a);
System.out.println(link.contains("火车尾"));
System.out.println(link.contains("哈哈哈"));
System.out.println(link.contains(null));
System.out.println(link.set(3,"嘻嘻嘻"));
link.printLink();
System.out.println(link.remove("嘻嘻嘻"));
link.printLink();
System.out.println(link.remove("哈哈哈"));
}
}