码迷,mamicode.com
首页 > 编程语言 > 详细

Java中LinkedList笔记

时间:2015-07-28 16:13:19      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

之前写程序似乎也没有怎么关注过底层的结构,最近正好遇到了链表的问题,于是仔细阅读了Java中链表的实现LinkedList

简单记录一下看完的总结:

1.LinkedList中定义了一个类型Node<E> ,包括3个属性,即Node中封装的元素item,当前元素的前一个元素引用和后一个元素引用prev/next,和链表定义一直,没什么新鲜

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

2.链表的特点是在首尾添加内容比较快捷,所以LinkedList除了实现List接口的add/remove外,还增加了在首尾增加元素的方法addFirst/addList ,removeFirst,removeLast,以及getFirst,getLast获取首尾元素的方法

3.List接口中得get/remove/add等操作实际上都是操作链表的最末尾


其中我一直想知道的是链表中对List接口中得get(index)方法是如何实现的,或者说现实容易,有什么优化呢,看了源代码,发现原来优化的内容并没有我想像的高端,具体是:

 首先,看index位于的链表的前一半还是后一半(对size>>1 得出中间数,然后判断index和size>>1的关系得知)

然后,如果index在链表的前半部分,就正向遍历,如果index在链表的后半段,则是从末尾开始遍历

这是LinkedList中根据给定的索引index获取元素的实现:

Node<E> node(int index) {
        // assert isElementIndex(index);
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }


当打算源代码的时候,如果其中的大部分内容已经知道个大概了,只有一些细节不清楚,这种状态下,收获最大,完全不知道,或者完全知道的时候,看源代码都没有什么意思,这是一直以来我的学习心得。


Java中LinkedList笔记

标签:

原文地址:http://my.oschina.net/ericliuandhisfriends/blog/484671

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!