文档章节

java实现双向链表

淡看江湖
 淡看江湖
发布于 2016/02/05 14:45
字数 504
阅读 207
收藏 8

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

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

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

© 著作权归作者所有

共有 人打赏支持
上一篇: mybatis物理分页
下一篇: 偶有所感
淡看江湖
粉丝 35
博文 82
码字总数 92173
作品 0
浦东
后端工程师
私信 提问
Java_LinkedList_数据结构

java api 在包java.util.LinkedList中有一个LinkedList双向链表类;在由于最近有许多的java课程作业,兴趣之余自己写了一个类似的LinkedList类。由于是从C/C++转向java的,代码中还是有许多C...

掬一捧
2012/04/16
0
0
JDK容器学习之LinkedList:底层存储&读写逻辑

LinkedList的底层结构及读写逻辑 链表容器,通常适用于频繁的新增删除,遍历的方式访问数据元素的场景 LinkedList 底层数据结构为链表,非线程安全,本片博文则简单分析下增删改对链表的操作...

小灰灰Blog
2017/10/20
0
0
《数据结构与算法系列》合集整理

《数据结构与算法系列》合集整理 整理来自博客园skywang12345,以下摘自作者介绍: “最近抽空整理了"数据结构和算法"的相关文章。在整理过程中,对于每种数据结构和算法分别给出"C"、"C++"...

kaixin_code
12/01
0
0
聊聊LinkedHashMap

LinkedHashMap简介 LinkedHashMap是一个根据某种规则有序的hashmap。根据名字,我们也可以看出这个集合是有hash散列的功能的同时也有顺序。hashmap是无法根据某种顺序来访问数据的,例如放入...

xpbob
11/12
0
0
Vector、ArrayList、LinkedList 有什么区别?

版权声明:本文供交流学习,能够帮助到你是我最大的荣幸! https://blog.csdn.net/u014231523/article/details/82086185 这个问题主要是考察集合框架的问题,主要考察三者之间的设计区别,以...

兴国First
08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Rainbond V5.0 Beta公测公告

Rainbond支撑企业应用的开发、架构、交付和运维的全流程,通过“无侵入”架构无缝衔接各类企业应用,底层资源可以对接和管理IaaS、虚拟机和物理服务器 Rainbond V5.0即日起开启Beta版本公测,...

好雨云帮
15分钟前
2
0
Word Pattern(leetcode290)

Given a pattern and a string str, find if str follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empt......

woshixin
21分钟前
0
0
Kubernetes 1.13.1快速升级

Kubernetes 1.13.1已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.12.3版本暂时不支...

openthings
24分钟前
2
0
多线程的实现方式

多线程是指 一个程序运行时,产生或使用了不止一个线程。 线程的生命周期是怎么样的,下面这张图我们可以看出些端倪: 这章我们主要讨论多线程实现的方式,基础知识部分我们可以下来再恶补。...

搬砖大侠
36分钟前
1
0
新人千万不要在 Windows 上使用 Ruby on Rails

标题:新人千万不要在 Windows 上使用 Ruby on Rails 副标题:鼓励新人在 Linux 和 Mac 上使用 Ruby on Rails ! 原则:要走寻常路,不要学美特斯邦伟! "在 Windows上 使用 Ruby on Rails "是...

Jason909
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部