LinkedList类的实现

与前面的ArrayList一样,我们要实现一个叫做MyLinkedList的链表类。
1. MyLinkedList类本身,包含到两端的链,表的大下以及一些方法。
2. Node类,他可能是一个私有的嵌套类。一个节点包含数据以及到前一个节点的链和到下一个节点的链,还有一些适当的构造方法。
3. LinkedListIterator类,该类抽象了位置的概念,是一个私有类,并实现接口Iterator。它提供了方法next,hasNext,remove的实现。

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

import java.util.NoSuchElementException;
import java.util.function.Consumer;

/**
 * @author hasherc
 * @ 17-7-21
 */
public class MyLinkedList<E> implements Iterable<E> {


    private static class Node<E>{
        public Node(E d, Node<E>p ,Node<E> n){
            data = d;
            prev = p;
            next = n;
        }
        public E data;
        public Node<E> prev;
        public Node<E> next;
    }

    public MyLinkedList(){
        clear();
    }

    public void clear() {
        beginMarker = new Node<E>(null,null,null);
        endMarker = new Node<E>(null,beginMarker,null);
        beginMarker.next = endMarker;

        theSize = 0;
        modCount ++;

    }

    public int size(){return theSize;}

    public boolean isEmpty(){return theSize == 0;}

    public boolean add(E x){
        add(size(), x);
        return true;
    }

    public void add(int index, E x) {
        addBefore(getNode(index), x);
    }

    public E get(int index){
        return getNode(index).data;
    }

    public E set(int index, E element){
        Node<E> p = getNode(index);
        E oledElement = p.data;
        p.data = element;
        return oledElement;
    }

    public  E remove(int index){
        return remove(getNode(index));
    }



    private Node<E> getNode(int index) {

        Node<E> p;

        if(index < 0 || index > size()){
            throw new IndexOutOfBoundsException();
        }
        if (index < size()/2){
            p = beginMarker.next;
            for (int i = 0; i<index; i++)
                p = p.next;
        }
        else {
            p = endMarker;
            for(int i = size(); i >index ; i--)
                p = p.prev;
        }
        return p;
    }

    private void addBefore(Node<E> p, E x){
        Node<E> newNode = new Node<E>(x, p.prev, p);
        newNode.prev.next = newNode;
        p.prev = newNode;
        theSize++;
        modCount++;

    }

    private E remove(Node<E> p){
        p.next.prev = p.prev;
        p.prev.next = p.next;
        theSize--;
        modCount++;
        return p.data;
    }


    private int theSize;
    private int modCount = 0;
    private Node<E> beginMarker;
    private Node<E> endMarker;

    @Override
    public Iterator<E> iterator() {
        return new LinkedListIterator();
    }


    private class LinkedListIterator implements Iterator<E>{
        private Node<E> current = beginMarker.next;
        private int expectedModCount = modCount;
        private boolean okToRemove = false;

        @Override
        public boolean hasNext() {
            return current != endMarker;
        }

        @Override
        public E next() {
            if(modCount != expectedModCount)
                throw new ConcurrentModificationException();
            if(!hasNext())
                new NoSuchElementException();

            E nextItem = current.data;
            current = current.next;
            okToRemove = true;
            return nextItem;
        }

        @Override
        public void remove() {
            if(modCount != expectedModCount)
                throw new ConcurrentModificationException();
            if (!okToRemove)
                throw new IllegalStateException();
            MyLinkedList.this.remove(current.prev);
            okToRemove = false;
            expectedModCount++;
        }
    }

    public static void main(String[] args) {
        MyLinkedList<Integer> test = new MyLinkedList<Integer>();
        test.add(1);
        test.add(1);
        test.add(1);
        test.add(1);
        Iterator<Integer> iterator = test.iterator();
        while(iterator.hasNext()){
            Integer integer = iterator.next();
            if(1 == integer){
                iterator.remove();
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【问题描述】 请设计一个链表实现链表的初始化、插入、删除和打印操作。 节点的定义如下: typedef int elementType; typedef struct node { elementType data; node* next; } LList, *PList; 链表的定义及要求如下: class linkedList { public: linkedList();//构造函数 virtual ~linkedList();//析构函数,注意要链表中所有节点的资源 void insert( int value );//警告:必须初始化才能使用! bool initiate();//初始化单链表,使用new操作创建头结点。如果创建失败,则返回false,否则返回true bool isEmpty();//判断单链表是否为空 //删除单链表中第pos个元素结点,并将删除的节点的值存在value中。 //注意:如果链表为空、删除位置大于链表长度、以及删除位置为0的情况,需要终止删除并输出相应信息 bool remove( int pos, int& value ); void print();//顺序打印单链表,如果是单链表为空,则输出 Empty int Length();//返回单链表长度。如果是单链表为空,则返回-1 private: LList *head; int len; }; main函数: int main(int argc, char* argv[]) { linkedList L1; int n; int val; //初始化链表 if(!L1.initiate()) return 0; cin>>n;//输入链表中数据个数 for(int i=0; i<n; i++) //输入n个数,并插入链表 { cin>>val; L1.insert(val); } cout << "Origin Length:" << L1.Length() << endl;//输出链表长度 cout << "data:" ; L1.print();//打印链表 cin>>n;//输入需要删除的数据的位置 if (L1.remove(n,val)) { //删除位置n的数据,并将删除的数据值放在val中 cout<<"Delete the data at position("<<n<<"):"<<val<<endl; cout<< "New Length:" << L1.Length()<< endl;//输出链表长度 cout<< "data:" ; L1.print();//打印链表 } return 0; } 【输入形式】 输入包括3行。 第一行是链表元素个数n。第二行为n个元素的值。第三行为拟删除的数据位置。 【输出形式】 输出格式不固定。具体参见样例。 【样例输入1】 4 1 2 3 4 2 【样例输出1】 Origin Length:4 data:1 2 3 4 Delete the data at position(2):2 New Length:3 data:1 3 4 【样例输入2】 2 100 -1 3 【样例输出2】 Origin Length:2 data:100 -1 pos > len, failed 【样例输入3】 8 8 7 6 5 4 3 2 1 0 【样例输出3】 Origin Length:8 data:8 7 6 5 4 3 2 1 pos <= 0, failed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值