java实现双向链表
java实现双向链表
-wangming- 发表于2年前
java实现双向链表
  • 发表于 2年前
  • 阅读 205
  • 收藏 8
  • 点赞 1
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 最近项目也不是很忙了。就想着研究一下数据结构。链表算是经常用到的一种数据结构了,现将自己的实现展示如下,欢迎大神赐教。

第一个版本,没有最后一个节点,每次从根节点开始遍历

public class  LinkedList<E> {
     
    private Node head;
     
    public LinkedList() {
    }
     
    public E getFirst(){
        if(head==null){
            return null;
        }
        return head.value;
    }
     
    public LinkedList<E> addFirst(E e){
        head.pre=new Node(e, null, head);
        head=head.pre;
        return this;
    }
     
    public LinkedList<E> addNode(E e){
        Node lst=head;
        if(lst==null){
            this.head=new Node(e, null, null);
            return this;
        }else{
            while(true){
                if(lst.next==null){
                    break;
                }else{
                    lst=lst.next;
                }
            }
            lst.next=new Node(e, lst, null);
            return this;
        }
    }
     
    public LinkedList<E> remove(E e){
        Node lst=head;
        if(lst==null){
            throw new NullPointerException("the LinkedList is empty.");
        }else{
            while(true){
                if(e.equals(lst.value)){
                    //移除这个元素
                    if(lst.pre!=null){
                        lst.pre.next=lst.next;
                    }
                    if(lst.next!=null){
                        lst.next.pre=lst.pre;
                    }
                    lst=null;
                    break;
                }
                lst=lst.next;
            }
            return this;
        }
    }
     
     
    @Override
    public String toString() {
        StringBuffer buff=new StringBuffer("[");
        Node lst=this.head;
        while(lst!=null){
            buff.append(lst.value+",");
            lst=lst.next;
        }
        return buff.substring(0, buff.length()-1)+"]";
    }
     
    /**节点信息*/
    private class Node{
        public Node pre;
        public E value;
        public Node next;
         
        public Node(E value,Node pre,Node next) {
            this.value=value;
            this.pre=pre;
            this.next=next;
        }
    }
     
}

第二个版本,有了最后一个节点

public class  LinkedList<E> {
    
    private Node head;
    private Node last;
    
    public LinkedList() {
    }
    
    public E getFirst(){
        if(head==null){
            return null;
        }
        return head.value;
    }
    public E getLast(){
        if(last==null){
            return null;
        }
        return last.value;
    }
    
    public LinkedList<E> addFirst(E e){
        head.pre=new Node(e, null, head);
        head=head.pre;
        return this;
    }
    
    public LinkedList<E> addNode(E e){
        Node lst=last;
        if(lst==null){//如果最后一个节点是空的则这个链表就是空的
            this.last=new Node(e, null, null);
            this.head=this.last;
            return this;
        }else{
            while(true){
                if(lst.next==null){//
                    break;
                }else{
                    lst=lst.next;
                }
            }
            lst.next=new Node(e, lst, null);
            last=lst.next;
            return this;
        }
    }
    
    public LinkedList<E> remove(E e){
        Node lst=head;
        if(lst==null){
            throw new NullPointerException("the LinkedList is empty.");
        }else{
            while(true){
                if(e.equals(lst.value)){
                    //移除这个元素
                    if(lst.pre!=null){
                        lst.pre.next=lst.next;
                    }
                    if(lst.next!=null){
                        lst.next.pre=lst.pre;
                    }
                    lst=null;
                    break;
                }
                lst=lst.next;
            }
            return this;
        }
    }
    
    
    @Override
    public String toString() {
        StringBuffer buff=new StringBuffer("[");
        Node lst=this.head;
        while(lst!=null){
            buff.append(lst.value+",");
            lst=lst.next;
        }
        return buff.substring(0, buff.length()-1)+"]";
    }
    
    /**节点信息*/
    private class Node{
        public Node pre;
        public E value;
        public Node next;
        
        public Node(E value,Node pre,Node next) {
            this.value=value;
            this.pre=pre;
            this.next=next;
        }
    }
    
}

注:以上两个版本都没有考虑在多线程下使用的情况。

共有 人打赏支持
粉丝 33
博文 78
码字总数 89622
×
-wangming-
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: