`
javaroad
  • 浏览: 21465 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

结合JDK学习数据结构——线性表链式存储

阅读更多

     单链表比较简单,直接说双向循环链表,用c语言双向链表的结构定义如下:

typedef struct DNode
{
  ElemType data;
  struct DNode *priror, *next ;
} DNode ,*DoubleList;

      如果p指向双链表中某一节点,则有:p->prior->next = p = p->next->prior。

      再来看看jdk中LinkedList是如何实现双向链表的:

private static class Entry<E> {
	E element;
	Entry<E> next;
	Entry<E> previous;

	Entry(E element, Entry<E> next, Entry<E> previous) {
	    this.element = element;
	    this.next = next;
	    this.previous = previous;
	}
    }

       用到内部私有静态类来定义双向链表结构。

       实例变量和初始化的定义如下:

//这个节点永远不会保存值
private transient Entry<E> header = new Entry<E>(null, null, null);

private transient int size = 0;
//定义一个空的双向链表
public LinkedList() {
        header.next = header.previous = header;
    }

       下面在来看看默认的插入操作:

 

public boolean add(E e) {
       //循环链表,实际上header可以说是新节点的后一个元素
       //把header当做头节点,e当做尾节点更好理解一些
	addBefore(e, header);
        return true;
    }

private Entry<E> addBefore(E e, Entry<E> entry) {
      /**新节点的数据为e,此处新节点的初始化干了不少活,
         *非常之妙,把header的前驱(即最后一个元素)赋值给新值的前驱,把
         *header赋值给新值的后驱,
         */
	Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
        //最后一个元素指向新节点
	newEntry.previous.next = newEntry;
        //header的前驱指向新节点
	newEntry.next.previous = newEntry;
	size++;
	modCount++;
	return newEntry;
    }

     上面是尾插法。其实头插法也是调用addBefore方法。你能想到怎么调用吗?其实这个时候把第一个节点作为头节点考虑就一目了然了,即尾插法是在头节点之前插入新节点,那头插法是在头结点之后或者说是在第一个节点之前插入新节点。

     把addBefore(e, header)换成addBefore(e, header.next)即可,太清晰易懂了,如果让我们去实现代码,能做到复用得如此完美吗?

     再看看按序号删除又是如何实现的。原以为会从头遍历,然后计数器==序号即开始删除,结果却又想错了。jdk的实现也考虑到了效率问题,稍微做了点优化,其实既然是双向循环,那当然是往前找也可以,往后找也可以了。

public E remove(int index) {
        return remove(entry(index));
    }
 private Entry<E> entry(int index) {
        if (index < 0 || index >= size)
            throw new IndexOutOfBoundsException("Index: "+index+
                                                ", Size: "+size);
        Entry<E> e = header;
        //小于size的一半时从前往后遍历,大于size的一半时从后往前遍历
        if (index < (size >> 1)) {
            for (int i = 0; i <= index; i++)
                e = e.next;
        } else {
            for (int i = size; i > index; i--)
                e = e.previous;
        }
        return e;
    }

//具体的删除方法,没有什么特别的,不过按值、按序号删除都复用了这个方法
private E remove(Entry<E> e) {
	if (e == header)
	    throw new NoSuchElementException();

        E result = e.element;
	e.previous.next = e.next;
	e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
	size--;
	modCount++;
        return result;
    }

    查找、替换等方法比较简单,就不在这浪费笔墨了。当然LinkedList也能实现队列、栈等线性表,这些内容另开一篇文章来分析。

分享到:
评论

相关推荐

    Java JDK 6学习笔记——ppt简体版.rar

    这份"Java JDK 6学习笔记——ppt简体版"提供了关于这个关键版本的详细教程,适合初学者和有一定经验的开发者来深入理解Java编程。 首先,我们要了解Java JDK是什么。Java Development Kit,简称JDK,是Oracle公司...

    Java JDK 6学习笔记——ppt简体版附课本代码

    总的来说,“Java JDK 6学习笔记——ppt简体版”全面介绍了Java编程语言的基础知识和JDK 6的关键特性,结合配套的代码示例,是系统学习和掌握Java开发的宝贵资料。无论你是Java初学者还是寻求提升的老手,都能从中...

    Java JDK 6学习笔记——ppt简体版 第20章.ppt

    Java JDK 6学习笔记——ppt简体版 第20章.ppt

    Java JDK 6学习笔记——ppt简体版 第19章.ppt

    Java JDK 6学习笔记——ppt简体版 第19章.ppt

    Java JDK 6学习笔记——ppt简体版 第18章.ppt

    Java JDK 6学习笔记——ppt简体版 第18章.ppt

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记——PPT简体版是针对初学者和有经验的开发者们的一份宝贵资源,它深入浅出地介绍了Java编程语言的核心概念和技术。这份笔记以PPT的形式呈现,使得学习过程更加直观易懂,适合课堂教学或自我学习。...

    Java JDK 6学习笔记——ppt

    Java JDK 6学习笔记——PPT简体版是针对初学者和有经验的开发者们的一份宝贵资源,它深入浅出地介绍了Java编程语言的核心概念和技术。这份资料以PPT的形式呈现,使得学习过程更加直观易懂,同时包含了课程中的源代码...

    JDK 6学习笔记——PPT简体版

    **JDK 6学习笔记——PPT简体版** Java Development Kit(JDK)是Java编程语言的核心组件,它提供了开发和运行Java应用程序所需的工具和环境。JDK 6是Oracle公司发布的一个重要版本,为开发者带来了许多改进和新特性...

    linux安装jdk(csdn)————程序.pdf

    Linux安装JDK指南 ...* JDK的安装目录结构 * JDK的环境变量配置 八、结语 本文指导了读者如何在Linux系统上安装JDK,从解压缩JDK安装包到检测JDK安装的每一步骤。本文适合初学者和经验丰富的开发者和系统管理员。

    java jdk5.0学习笔记——良葛格

    11. **并发编程改进**:引入了java.util.concurrent包,提供了线程安全的数据结构和并发工具类,如ExecutorService、Semaphore等,使得多线程编程更加高效和易用。 12. **NIO(非阻塞I/O)**:Java 5.0引入了NIO...

    良葛格————JavaJDK5.0学习笔记PDF

    良葛格————JavaJDK5.0学良葛格————JavaJDK5.0学习笔记PDF.rar习笔记PDF.rar良葛格良葛格————JavaJDK5.0学习笔记PDF.rar————JavaJDK5.0学习笔记PDF.rar良葛格————JavaJDK5.0学习笔记PDF.rar良...

    JDK8新特性——Stream.pdf

    Stream是JDK8为了更好地支持函数式编程引入的一个数据处理管道,它允许你以声明方式处理数据集,并可以进行并行处理。 Stream的创建可以基于集合(如List、Set等)、数组和特定的IO资源(如Files)。 例如,在内容...

Global site tag (gtag.js) - Google Analytics