标签:
问题描述:
LinkedList
问题分析:
基本的实现
代码实现:
package c03;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
 * @project: DataStructureAndAlgorithmAnalysis
 * @filename: MyLinkedList.java
 * @version: 0.10
 * @author: Jimmy Han
 * @date: 21:56 2015/7/15
 * @comment: Test Purpose
 * @result:
 */
public class MyLinkedList<AnyType> implements Iterable<AnyType>{
    private static class Node<AnyType>{
        public Node(AnyType d, Node<AnyType> p, Node<AnyType> n){
            data = d; prev = p; next = n;
        }
        public AnyType data;
        public Node<AnyType> prev;
        public Node<AnyType> next;
    }
    public MyLinkedList(){doClear();}
    public void clear(){doClear();}
    private void doClear(){
        beginMarker = new Node<AnyType>(null, null, null);
        endMarker = new Node<AnyType>(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, 0, size()), x);
    }
    public AnyType get(int idx){return getNode(idx).data;}
    public AnyType set(int idx, AnyType newVal){
        Node<AnyType> p = getNode(idx);
        AnyType oldVal = p.data;
        p.data = newVal;
        return oldVal;
    }
    public AnyType remove(int idx){
        return remove(getNode(idx));
    }
    private void addBefore(Node<AnyType> p, AnyType x){
        Node<AnyType> newNode = new Node<AnyType>(x, p.prev, p);
        newNode.prev.next = newNode;
        p.prev = newNode;
        theSize++;
        modCount++;
    }
    private AnyType remove(Node<AnyType> p){
        p.prev.next = p.next;
        p.next.prev = p.prev;
        theSize--;
        modCount++;
        return p.data;
    }
    private Node<AnyType> getNode(int idx){
        return getNode(idx, 0, size() - 1);
    }
    private Node<AnyType> getNode(int idx, int lower, int upper){
        Node<AnyType> p;
        if(idx < lower || idx > upper)
            throw new IndexOutOfBoundsException();
        if(idx < size()/2){
            p = beginMarker.next;
            for(int i = 0; i < idx; i++)
                p = p.next;
        }
        else{
            p = endMarker;
            for(int i = size(); i > idx; i--)
                p = p.prev;
        }
        return p;
    }
    public Iterator<AnyType> iterator(){
        return new LinkedListIterator();
    }
    private class LinkedListIterator implements Iterator<AnyType>{
        private Node<AnyType> 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);
            expectedModCount++;
            okToRemove = false;
        }
    }
    private int theSize;
    private int modCount = 0;
    private Node<AnyType> beginMarker;
    private Node<AnyType> endMarker;
    public static void main(String[] args) {
        MyLinkedList<String> marr = new MyLinkedList<String>();
        marr.add("www.");
        marr.add("bw");
        marr.add(".com");
        marr.add("s");
        marr.remove(3);
        marr.add(".cn");
        System.out.println(marr.get(2));
        System.out.println(marr.set(1,"hello"));
        printAll(marr.iterator());
    }
    private static void printAll(Iterator<String> iterator) {
        while(iterator.hasNext()){
            String item = iterator.next();
            System.out.print(item);
        }
    }
} 
标签:
原文地址:http://my.oschina.net/jimmyhan/blog/516039