资讯专栏INFORMATION COLUMN

LinkedList的实现

yimo / 368人阅读

package com.nasuf.arraylist;

import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyLinkedList implements Iterable {
    
    private int theSize;
    private int modCount = 0;
    private Node beginMarker;
    private Node endMarker;
    
    private static class Node {
        
        public AnyType data;
        public Node prev;
        public Node next;
        
        public Node(AnyType d, Node p, Node n) {
            data = d;
            prev = p;
            next = n;
        }
    }
    
    public MyLinkedList() {
        clear();
    }
    
    public void clear() {
        beginMarker = new Node (null, null, null);
        endMarker = new Node (null, beginMarker, null);
        beginMarker.next = endMarker;
        
        theSize = 0;
        modCount++;
    }
    
    public int size() {
        return theSize;
    }
    
    public boolean isEmpty() {
        return size() == 0;
    }
    
    public boolean add(AnyType x) {
        add(size(), x);
        return true;
    }
    
    public void add(int idx, AnyType x) {
        addBefore(getNode(idx), x);
    }
    
    public AnyType get(int idx) {
        return getNode(idx).data;
    }
    
    public AnyType set(int idx, AnyType newVal) {
        Node p = getNode(idx);
        AnyType oldVal = p.data;
        p.data = newVal;
        return oldVal;
    }
    
    public AnyType remove(int idx) {
        return remove(getNode(idx));
    }
    
    private AnyType remove(Node p) {
        p.next.prev = p.prev;
        p.prev.next = p.next;
        theSize --;
        modCount ++;
        return p.data;
    }
    
    private Node getNode(int idx) {
        Node p;
        
        if(idx < 0 || idx > size()) {
            throw new IndexOutOfBoundsException();
        }
        
        if(idx < size() / 2) {
            p = beginMarker.next;
            for (int i=0; iidx; i++) {
                p = p.prev;
            }
        }
        
        return p;
    }
    
    private void addBefore(Node p, AnyType x) {
        Node newNode = new Node(x, p.prev, p);
        newNode.prev.next = newNode;
        p.prev = newNode;
        theSize++;
        modCount++;
    }

    @Override
    public Iterator iterator() {
        return new LinkedListIterator();
    }
    
    private class LinkedListIterator implements java.util.Iterator {
        
        private Node current = beginMarker.next;
        private int expectedModCount = modCount;
        private boolean okToRemove = false;
        
        public boolean hasNext() {
            return current != endMarker;
        }

        public AnyType next() {
            if (modCount != expectedModCount) 
                throw new ConcurrentModificationException();
            if (!hasNext()) 
                throw new NoSuchElementException();
            
            AnyType nextItem = current.data;
            current = current.next;
            okToRemove = true;
            return nextItem;
        }
        
        public void remove() {
            if (modCount != expectedModCount) 
                throw new ConcurrentModificationException();
            if (!okToRemove) 
                throw new IllegalStateException();
            
            MyLinkedList.this.remove(current.prev);
            okToRemove = false;
            expectedModCount ++;
        }
    }

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67381.html

相关文章

  • Java LinkedList指南

    摘要:结构体是基于索引的数据结构,它提供了对其元素的随机访问,其性能为。在这样情况下,其元素搜索的复发度为。此外,还有方便的方法和返回。队列操作接口提供类似队列的行为实际上扩展了接口这些方法检索第一个元素并将其从列表中删除。结论通常是默认的实现。 1. 介绍 LinkedList是一个双向链表, 实现了List和Deque接口。它实现所有可选的list操作,并且存储对象可以为null。 2....

    BakerJ 评论0 收藏0
  • Java集合中LinkedList

    摘要:什么是是一个双向连表,实现了接口,该接口中定义了双向连表的一般操作。也实现了接口,所以包含的基本方法新增,删除,插入等都实现了。也继承了该类中定义了顺序访问所需实现的方法。 什么是LinkedList 1 LinkedList 是一个 Doubly-linked list双向连表,实现了Deque接口,该接口中定义了双向连表的一般操作。 2 LinkedList 也实现了List接...

    adie 评论0 收藏0
  • 单链表(LinkedListjavascript实现

    摘要:相关库编程思路方法用于将元素追加到链表尾部,借由方法来实现注意各个函数的边界条件处理。自己的实现源代码地址 起因 最近在看《数据结构与算法--javascript描述》,然后上npmjs.org去搜索,想找合适的库参考并记录下来,以备以后用时能拿来即用,最没有发现很合自己意的,于是就决定自己一一实现出来。 npmjs相关库 complex-list、smart-list、singly-...

    王陆宽 评论0 收藏0
  • 站在巨人肩膀上看源码-LinkedList

    摘要:在阅读源码之前,我们先对的整体实现进行大致说明实际上是通过双向链表去实现的。获取的最后一个元素由于是双向链表而表头不包含数据。实际上是判断双向链表的当前节点是否达到开头反向迭代器获取下一个元素。 第1部分 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操...

    learn_shifeng 评论0 收藏0
  • Java容器类研究5:LinkedList

    摘要:提供了顺序访问的方法,当然,大部分方法都依赖于来实现,所以将锅甩给了子类。实现了自己的遍历方法利用了链表结构的特性,进行遍历。其中有如下属性记录遍历状态。该方法位于中到数组中这里返回的不是,其实是 java.util.LinkedList Java中有现成的队列可以用吗 有,就是LinkedList。LinkedList实现的接口如下,其实也可以当做stack使用: public cl...

    frank_fun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<