实现自己的LinkedList

public class SimpleLinkedList<T>
{
    private static class Node<T>
    {
        T data;
        Node<T> next;

        public Node(T t, Node<T> n)
        {
            this.data = t;
            this.next = n;
        }

        public String toString()
        {
            return "(data=" + data + ")";
        }
    }

    private int size = 0;

    /**
     * 记录list被修改结构的次数
     */
    private int modCount = 0;

    private Node<T> head;

    public SimpleLinkedList(int size)
    {
        this.size = size;
        clear();
    }

    /**
     * clear the whole list
     */
    public void clear()
    {
        head = new Node<T>(null, null);
        this.size = 0;
        modCount++;
    }

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

    /***
     * 每次都在最前端插入<br>
     * 
     * @param x
     * @return
     */
    public boolean add(T x)
    {
        Node<T> t = new Node<T>(x, head.next);
        head.next = t;
        size++;
        modCount++;
        return true;
    }

    /***
     * id表示第id个元素,head为第0个,依次类推<br>
     * 
     * @param id
     * @return
     */
    public T get(int id)
    {
        if (id > size)
            return null;
        Node<T> temp;
        for (temp = head; id > 0; temp = temp.next, id--)
        {
        }
        return temp.data;
    }

    public T set(int id, T newValue)
    {
        if (id > size || id < 1)
            return null;
        Node<T> temp;
        for (temp = head; id > 0; temp = temp.next, id--)
        {
        }
        T oldValue = temp.data;
        temp.data = newValue;
        return oldValue;

    }

    public T remove(int id)
    {
        Node<T> temp = head;
        for (; id > 1; temp = temp.next, id--)
        {
        }
        T value = temp.next.data;
        temp.next = temp.next.next;
        size--;
        return value;
    }

    /***
     * 借助先进先出队列进行reverse操作<br>
     * 逻辑简单,但是效率不高<br>
     * 
     * @return
     */
    public void reverse_1()
    {
        // Stack<Node<T>> stack = new Stack<Node<T>>();
        Queue<Node<T>> queue = new LinkedList<>();
        Node<T> te = head;
        while (te.next != null)
        {
            te = te.next;
            queue.add(te);
        }
        /**
         * 清空原来的链表,重新建表<br>
         */
        clear();
        while (!queue.isEmpty())
        {
            add(queue.poll().data);
        }
    }

    /***
     * 反转链表 基本思想:逐个节点拆开,建一个新的list<br>
     */
    public void reverse_2()
    {
        Node<T> newHead = new Node<T>(null, null);
        while (head.next != null)
        {
            Node<T> temp = head.next;
            head.next = head.next.next;
            temp.next = newHead.next;
            newHead.next = temp;
        }
        head = newHead;
    }

    public String toString()
    {
        StringBuilder b = new StringBuilder();
        Node<T> temp = head.next;
        for (int i = 0; i < size; i++, temp = temp.next)
        {
            b.append(temp.toString() + "->");
        }
        b.append("NULL");
        return b.toString();
    }

    public Iterator<T> iterator()
    {
        return new LinkedListIterator();
    }

    private class LinkedListIterator implements Iterator<T>
    {
        Node<T> current = head;

        @Override
        public boolean hasNext()
        {
            return current.next != null;
        }

        @Override
        public T next()
        {
            if (hasNext())
            {
                current = current.next;
                return current.data;
            }
            return null;
        }

    }

    public static void main(String[] ar)
    {
        SimpleLinkedList<Integer> list = new SimpleLinkedList<Integer>(10);

        for (int i = 0; i < 10; i++)
        {
            list.add(i);
        }
        System.out.println(list);
        System.out.println("Get an element : (data=" + list.get(6) + ")");
        // System.out.println("Remove an element : (data=" + list.remove(6) +
        // ")");
        System.out.println("Remove an element : (data=" + list.set(6, 110) + ")");
        System.out.println("\nOriginal list : " + list);
        list.reverse_1();
        System.out.println("List after reversed_1 : " + list);
        list.reverse_2();
        System.out.println("List after reversed_2 : " + list);

        /***
         * Iterator
         */
        Iterator<Integer> it = list.iterator();
        while (it.hasNext())
            System.out.println("it.next = " + it.next());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值