首页 > 技术文章 > Java 自定义实现链表

cuglkb 2018-03-09 17:59 原文

自定义实现链表很简单,只需要明白链表是什么样子的数据结构。

下图表示一种单向列表。其中指针first指向队头,last指向队尾,curr指向当前读的数据。

下面是我的实现代码,很简单,明白上述结构后,关键是构造一个内部类,里面包含一个指向下一个元素的对象(指向下一个元素的指针)

public class MyLinkedList<T>{

    /**
     * 指向list中最后一个元素
     */
    Node<T> last;
    
    /**
     * 指向list中第一个元素
     */
    Node<T> first;
    
    /**
     * 指向当前读取的元素
     */
    Node<T> currRead;

    private int size ;

    /**
     * <默认构造函数>
     */
    public MyLinkedList(){
        size = 0;
        last = new Node(null,-1);
        first = last;
        currRead = first;
    }

    /**
     * 往链表中添加数据(队尾添加数据)
     * <功能详细描述>
     * @param element
     * @return
     * @see [类、类#方法、类#成员]
     */
    public T add(T element){
        Node<T> newNode = new Node<T>(null,element);
        last.next = newNode;
        last = newNode;
        if(size == 0){
            first = newNode;
        }
        size ++;
        return element;
    }

    /**
     * 移除链表中的数据(队头移除)
     * <功能详细描述>
     * @return
     * @see [类、类#方法、类#成员]
     */
    public T remove(){
        if(size == 0){
            System.out.println("empty list ");
            currRead = first;
            return null;
        }
        T result = first.element;
        first = first.next;
        currRead = first;
        size--;
        return result;
    }

    /**
     * 获取队列中的元素
     * <功能详细描述>
     * @return
     * @see [类、类#方法、类#成员]
     */
    public T get(){
        if(currRead.next == null){
            setReadAgain();
            return currRead.element;
        }
        T result = currRead.element;
        currRead = currRead.next;
        return result;
    }

    /**
     * 再次从头开始读取数据
     * <功能详细描述>
     * @see [类、类#方法、类#成员]
     */
    public void setReadAgain() {
        currRead = first;
    }

    public String toString(){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<size;i++){
           T ele = get();
           sb.append(currRead.element + "-->");
        }
        return sb.toString();
    }

    /**
     * 获取队列大小
     * <功能详细描述>
     * @return
     * @see [类、类#方法、类#成员]
     */
    public int getSize(){
        return this.size;
    }

    class Node<T> {
        Node<T> next;
        T element;
        public Node( Node<T> next, T element){
            this.next = next;
            this.element = element;
        }
    }

 

实践一下,看能不能使用

public class Test {
    public static void main(String[] args){

        MyLinkedList linkedList = new MyLinkedList();
        System.out.println("-------start-------");
        System.out.println(linkedList.toString());
        for (int i=0;i<5;i++){
            linkedList.add(i+1);
        }
        System.out.println(linkedList.toString());
        for(int i=0;i<5;i++){
            System.out.println(linkedList.remove());
        }

        System.out.println(linkedList.toString());
        System.out.println("-------end-------");
    }

 

下面是结果

 

推荐阅读