public class ShuangXiangLianBiao {
public static void main(String[] args) {
DoublyLink l=new DoublyLink();
l.addEndNode("a");
l.addEndNode("b");
l.addEndNode("c");
l.deleteNode("b");
l.printPrevNode();
l.printNextNode();
}
}
class DoublyLink{
class Node{
private Object data;
private Node prev=null;//prev向前的指针
private Node next=null;//next向后的指针
public Node(Object data){
this.data=data;
}
}
private Node root;//链表的第一个元素
private Node end;//链表的最后一个元素
public void addEndNode(Object data){//向后插入元素
Node newNode=new Node(data);
if(this.root==null&&this.end==null){//这个表的第一个为空,或最后一个为空,则表示链表没有元素
this.root=newNode;//则把newNode放在第一个元素
}else{//不满足第一个条件表示链表存在元素
this.end.next=newNode;//则把最后元素的指向下一个的指针指向新元素,新元素要一直向后放
newNode.prev=this.end;//新元素向前的指针指向end
}this.end=newNode;//完成后newNode成为最后一个元素
}
public void addRootEnd(Object data){//向前插入元素
Node newNode=new Node(data);
if(this.end==null&&this.root==null){//
this.end=newNode;
}else{
this.root.prev=newNode;//新元素放在根元素的前面一个
newNode.next=this.root;//新的元素下一个是根元素
}this.root=newNode;//新元素成为根元素
}
public void printNextNode(){//从前向后打印元素
Node newNode=this.root;//指定第一个元素
while(newNode!=null){
System.out.println(newNode.data);//输出当前元素
newNode=newNode.next;//指向下一个元素
}
}
public void printPrevNode(){//从最后向前打印元素
for(Node newNode=this.end;newNode!=null;newNode=newNode.prev){
System.out.println(newNode.data);
}
}
public boolean contains(Object data){//检查链表中是否包含某元素
Node newNode=null;
if(data.equals(this.root.data)){//某元素为第一个元素
return true;
}else if(data.equals(this.end.data)){//某元素为最后一个元素
return true;
}else if(this.root.next!=null){
newNode =this.root.next;
while(newNode!=null){
if(data.equals(newNode.data)){
return true;
}newNode=newNode.next;
}
}return false;
}
public void deleteNode(Object data){
Node newNode=null;
if(data.equals(this.root.data)){
this.root=this.root.next;
this.root.prev=null;
}else if(data.equals(this.end.data)){
this.end=this.end.prev;
this.end.next=null;
}else{
newNode=this.root.next;
while(newNode!=null){
if(data.equals(newNode.data))
newNode.prev.next=newNode.next;
newNode.next.prev=newNode.prev;
newNode=newNode.next;
}
}
}
}