双向链表的简单实现

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;
        }
        }
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值