`

java实现双向链表

阅读更多

LinkedList类里面较重要的方法就是"addBefore(){}"和"private void remove(DNode <T> curr){}"
很多方法都与它俩有关系!!

package LinkedList;

import java.util.Iterator;
import java.util.ListIterator;
import java.util.NoSuchElementException;

public class MyLinkedList<T> {
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private DNode<T> header;
    private int listSize;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    public MyLinkedList() {
        header = new DNode<T>();
        listSize = 0;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private static class DNode<T> {
        T nodeValue;
        DNode<T> prev;
        DNode<T> next;

        public DNode() { // for header
            nodeValue = null;
            prev = this; // left
            next = this; // right
        }

        public DNode(T item) {
            nodeValue = item;
            prev = this;
            next = this;
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    public boolean isEmpty() {
        return (header.prev == header || header.next == header);
    }
   
    public int size() {
        return listSize;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private DNode<T> addBefore(DNode<T> curr, T item) {
        DNode<T> newNode, prevNode;

        newNode = new DNode<T>(item);
       
        prevNode = curr.prev;
       
        newNode.prev = prevNode;
        newNode.next = curr;
       
        prevNode.next = newNode;
        curr.prev = newNode;

        return newNode;
    }

    public boolean add(T item) {
        addBefore(header, item);
        listSize++;
        return true;
    }
   
    public void addFirst(T item) {
        addBefore(header.next, item);
        listSize++;
    }
   
    public void addLast(T item) {
        addBefore(header, item);
        listSize++;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private void remove(DNode<T> curr) {
        if(curr.next == curr) return;
       
        DNode<T> prevNode = curr.prev, nextNode = curr.next;
       
        prevNode.next = nextNode;
        nextNode.prev= prevNode;
    }
   
    public boolean remove(Object o) {
        for(DNode<T> p = header.next; p != header; p = p.next) {
            if(o.equals(p.nodeValue)) {
                remove(p);
                listSize--;
                return true;
            }
        }
        return false;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    public void printList() {
        for(DNode<T> p = header.next; p != header; p = p.next)
            System.out.println(p.nodeValue);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private class MyIterator implements Iterator<T> {
       
        public DNode<T> nextNode = header.next;
        public DNode<T> lastReturned = header;
       
        public boolean hasNext() {
            return nextNode != header;
        }
       
        public T next() {
            if(nextNode == header)
                throw new NoSuchElementException("");
           
            lastReturned = nextNode;
            nextNode = nextNode.next;
            return lastReturned.nodeValue;
        }

        public void remove() {
            if(lastReturned == header)
                throw new IllegalStateException("");
           
            MyLinkedList.this.remove(lastReturned);
            lastReturned = header;
            listSize--;
        }
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private class MyListIterator extends MyIterator implements ListIterator<T> {
       
        private int nextIndex;
       
        MyListIterator(int index) {
            if(index < 0 || index > listSize)
                throw new IndexOutOfBoundsException("");
           
            //如果index小于listSize/2,就从表头开始查找定位,否则就从表尾开始查找定位
            if(index < (listSize >> 1)) {
                nextNode = header.next;
                for(nextIndex = 0; nextIndex < index; nextIndex++)
                    nextNode = nextNode.next;
            }else {
                nextNode = header;
                for(nextIndex = listSize; nextIndex > index; nextIndex--)
                    nextNode = nextNode.prev;
            }
        }

        public boolean hasPrevious() {
            return nextIndex != 0;
            //return nextNode.prev != header;
        }
       
        public T previous() {
            if (nextIndex == 0)
                throw new NoSuchElementException("no");
           
            lastReturned = nextNode = nextNode.prev;
            nextIndex--;
            return lastReturned.nodeValue;
        }
       
        public void remove() {
            if(lastReturned == header)
                throw new IllegalStateException("");
           
            MyLinkedList.this.remove(lastReturned);
            nextIndex--;
            listSize--;
           
            if(lastReturned == nextNode)
                nextNode = nextNode.next;
            lastReturned = header;
        }
       
        public void add(T item) {
            MyLinkedList.this.addBefore(nextNode, item);
            nextIndex++;
            listSize++;
            lastReturned = header;
        }
       
        public void set(T item) {
             if (lastReturned == header)
                 throw new IllegalStateException();
            
             lastReturned.nodeValue = item;
        }
       
        public int nextIndex() {
            return nextIndex;
        }

        public int previousIndex() {
            return nextIndex - 1;
        }
    }
   
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    public Iterator<T> iterator() {
        return new MyIterator();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    public ListIterator<T> listIterator(int index) {
        return new MyListIterator(index);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    public static void main(String[] args) {
        MyLinkedList<String> t = new MyLinkedList<String>();
        t.add("A");
        t.add("B");
        t.add("C");
        t.add("D");
        //t.remove("B");
        //t.addFirst("AA");
        //t.addLast("BB");
        //t.printList();
       
       
        ListIterator<String> it = t.listIterator(t.size());
       
        while(it.hasPrevious()) {
            System.out.println(it.previous()); // D C B A
        }
    }

}// MyLinkedList end~

 

ArrayList 底层数组实现的,当实例化一个ArrayList是也相当实例化了一个数组
所以对元素的随即访问较快,而增加删除操作慢
LinkedList 底层实现是一个双向链表,没一个结点都包含了前一个元素的引用和后一个元素的引用和结点值
所以对元素的随即访问很慢,而增删较快

java 实现链表和c实现一样。 就是指针变成了引用。

分享到:
评论

相关推荐

    Java实现双向链表

    用Java定义一个双向链表,实现链表的基本操作: 初始化、获取头结点、添加新元素、删除链表元素、 获取链表元素、查找链表元素、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空链表。

    用java实现双向链表操作

    用java实现双向链表的完整操作,主要用到内部类实现。

    JAVA实现双向链表的增删功能的方法

    JAVA实现双向链表的增删功能的方法 本篇文章主要介绍了JAVA实现双向链表的增删功能的方法,包括了链表的创建、插入节点、删除节点等操作。下面将对相关知识点进行详细解释。 一、链表的基本概念 链表是一种数据...

    Java实现双向链表(两个版本)

    主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下

    JAVA实现链表_双向链表

    JAVA实现链表_双向链表

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    java 实现双向链表实例详解

    Java 实现双向链表实例详解 Java 实现双向链表实例详解是一种基本的数据结构,在 Java 中 LinkedList 已经实现了这种结构,但是作为开发者,也要拥有自己显示这种结构的能力。双向链表是一种动态的数据结构,它可以...

    JAVA双向链表反转实现

    以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...

    数组、单链表和双链表介绍以及双向链表的CC++Java实现 数组和链表.pdf

    数组、单链表和双链表介绍以及双向链表的C、C++和Java实现 在计算机科学中,数组、单链表和双链表是最基本的数据结构。它们都是线性表的实现方式,具有相同类型的n(n≥0)个数据元素组成的有限序列。 数组 数组是...

    Java有序非循环双向链表算法实例

    在Java编程中,有序非循环双向链表是一种重要的数据结构,它在许多复杂的数据操作和算法实现中扮演着核心角色。有序意味着链表中的元素按照特定的顺序排列,非循环则表示链表的首节点和尾节点之间没有链接,使得遍历...

    DoublyLinkedList:用 Java 实现双向链表

    使用 Eclipse、Maven、JUnit、SonarQube 和 JaCoCo 使用 Java 实现双向链表。 嵌套类摘要 private class DLNode 现场总结 - DLNode&lt;T&gt; first - DLNode&lt;T&gt; last 构造函数总结 + DLList() 方法总结 + boolean ...

    拆分双向链表.zip

    在本文中,我们将深入探讨...这个例子展示了如何利用Java实现双向链表的高效拆分,对于理解和操作链表数据结构非常有帮助。通过这种方式,我们可以解决许多其他涉及链表操作的算法问题,例如合并排序链表或链表的反转。

    Java双向链表的实现

    下面我们将详细讲解如何实现一个自定义的Java双向链表,并参考提供的`LinkNode.java`文件来理解其内部机制。 首先,我们需要定义一个表示链表节点的类`LinkNode`。这个类通常包含三个属性:存储数据的`data`字段、...

    双端链表和双向链表Java代码

    本主题主要关注两种特殊类型的链表——双端链表(Double-ended LinkedList)和双向链表(Bidirectional LinkedList),并以Java语言实现为例进行讲解。 双端链表,也称为双链表,是一种允许在链表的两端进行插入和...

    Java算法实例-双向链表操作

    本实例聚焦于Java中的一个重要数据结构——双向链表,它在很多场景下都有着广泛的应用。双向链表与单链表相比,其独特之处在于每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针,这使得在链表中的...

    单链表双向链表java实现

    在这个话题中,我们将深入探讨两种基本的线性数据结构——单链表和双向链表,并通过Java语言来实现它们。 单链表是一种线性数据结构,其中每个元素(称为节点)包含两个部分:数据域和指针域。数据域存储实际的数据...

    doublelink.zip_DoubleLink java_双向链表实现

    在本文中,我们将深入探讨如何使用Java编程语言实现一个高效的双向链表数据结构,并通过测试用例进行验证。首先,让我们了解双向链表的基本概念。 双向链表是一种线性数据结构,其中每个节点包含两个指针,分别指向...

    Java LinkedList 双向链表实现原理

    相信大家都明白 LinkedList 是基于双向链表而实现的,本篇文章主要讲解一下双向链表的实现,并且我们参考 LinkedList 自己实现一个单链表尝试一下。 什么是链表? 简单的来讲一下什么是链表:首先链表是一种线性的...

    双向链表(java实现)

    在实际开发中,Java的`java.util.LinkedList`类已经为我们提供了内置的双向链表实现。然而,理解如何自定义实现双向链表有助于深入理解数据结构和算法,对于提升编程技能和解决问题的能力大有裨益。

Global site tag (gtag.js) - Google Analytics