LinkedList

想到一个优化


  • `if (prev == null) {
    first = next;
    } else {
    prev.next = next;
    x.prev = null;
    }

    if (next == null) {
    last = prev;
    } else {
    next.prev = prev;
    x.next = null;
    }`
    要是给链表分别插入一个虚拟的头结点和尾节点,就不用每次这样判断了所有操作都可以看成是链表内的操作,岂不是美滋滋。

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

优化从前面开始找,还是从后面开始找。
从这个代码可以看出来,链表的编号是从0开始的。

java子类直接屏蔽父类的同名变量。

iteratorlistiterator的区别

http://stackoverflow.com/questions/10977992/difference-between-iterator-and-listiterator

List的iterator方法

public Iterator<E> iterator() {
        return listIterator();
    }

public ListIterator<E> listIterator() {
        return listIterator(0);
    }
    public ListIterator<E> listIterator(final int index) {
        checkForComodification();
        rangeCheckForAdd(index);

        return new ListIterator<E>() {
            private final ListIterator<E> i = l.listIterator(index+offset);

            public boolean hasNext() {
           .........
           ..........
        };
    }

其实是获取了是获取了ListIterator然后进行了向上转型。


 previous()的实现效果

public static void main(String[] args){
        LinkedList<Integer> list=new LinkedList<Integer>(); 
        for (int i=0;i<9;i++){
            list.add(i); 
        }
        ListIterator<Integer> li=list.listIterator(); 
//      while (li.hasNext()){
//          System.out.println(li.next()); 
//      } 
        for (int i=0;i<4;i++){
            System.out.println(li.next()); 
        }; 
        System.out.println(li.previous()); 
        System.out.println(li.previous()); 
        System.out.println(li.next());
        System.out.println(li.next()); 
    }
output:
0
1
2
3
3
2
2
3



感觉next()和previces()这两个函数的效果与含义不相符,既然已经输出了3那么previces()应该是2,previces()是2了那next()又是2??

找到一个解释:

E next()
Returns the next element in the list. This method may be called repeatedly
previous to go back and forth. (Note that alternating calls to next and previous will return the same element repeatedly.)
http://stackoverflow.com/questions/15598297/listiterator-next-and-previous-detail

public void forEachRemaining(Consumer<? super E> action) {
            Objects.requireNonNull(action);
            while (modCount == expectedModCount && nextIndex < size) {
                action.accept(next.item);
                lastReturned = next;
                next = next.next;
                nextIndex++;
            }
            checkForComodification();
        }
        这是迭代器中的一个方法,意思是讲当前位置以后的元素都处理一遍,其中Consumer<? super E> action的? super E指的是E的父类,而Consumer是一个函数借口FIFI主要是为了支持Lambda表达式。
 public Iterator<E> descendingIterator() {
        return new DescendingIterator();
    }
    由于Iterator只能是单向的,而List是双向的所以实现了两个Iterator,这个反向的Iterator是调用ListItr的方法实现的。这是代理吗?
LinkedList是Java中的一个类,它实现List接口和Deque接口,可以被看作是一个顺序容器、队列和栈。LinkedList的遍历过程和查找过程类似,可以从头节点开始往后遍历。然而,LinkedList不擅长随机位置访问,如果使用随机访问遍历LinkedList,效率会很低。通常情况下,我们会使用foreach循环来遍历LinkedList,因为foreach最终会转换成迭代器形式。LinkedList的遍历核心就是它的迭代器实现。[1] LinkedList的继承体系较为复杂,它继承自AbstractSequentialList类,并实现List和Deque接口。AbstractSequentialList是一个基于顺序访问的接口,通过继承此类,子类只需实现部分代码即可拥有完整的一套访问某种序列表的接口。LinkedList实现了Deque接口,Deque又继承自Queue接口,因此LinkedList具备了队列的功能。[2][3] LinkedList实现方式决定了所有与下标有关的操作都是线性时间复杂度,而在首段或末尾删除元素只需要常数时间复杂度。LinkedList没有实现同步(synchronized),如果需要多个线程并发访问,可以使用Collections.synchronizedList()方法对其进行包装。[2] 总结来说,LinkedList是一个灵活的数据结构,可以用作顺序容器、队列和栈。它的遍历过程需要注意效率问题,不适合随机位置访问。LinkedList的继承体系较为复杂,继承自AbstractSequentialList类,并实现List和Deque接口。LinkedList实现方式决定了与下标有关的操作是线性时间复杂度,而在首段或末尾删除元素只需要常数时间复杂度。[1][2][3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值