单链表的实现

2017-10-27  本文已影响0人  wisdom1991

单链表也是最基本的一个数据类型,相对比较简单。
如果有任何疑问欢迎来探讨。

首先是节点数据

package ListExercise;

public class Node<T> {
    // 下一个节点
    public Node<T> next;
    // 任意数据类型
    public T data;

    // 初始化数据
    public Node(T t) {
        this.data = t;
        next = null;
    }
}

接下来是我们的核心代码

package ListExercise;

public class LinkedList<T> {

    // 头结点
    private Node<T> headNode;
    // 链表长度
    private int size;

    // -1是头节点,没有数据
    public LinkedList() {
        size = 0;
        headNode = new Node<T>(null);
    }

    // 添加元素data
    public boolean add(T data) {
        boolean ret = false;
        Node<T> node = getHide(this.size - 1);
        node.next = new Node<T>(data);

        size++;
        ret = true;
        return ret;
    }

    // 添加元素data
    public boolean insert(int index, T data) {
        boolean ret = false;
        Node<T> node = getHide(index - 1);
        Node<T> nextNode = node.next;
        node.next = new Node<T>(data);
        node.next.next = nextNode;

        size++;
        ret = true;
        return ret;
    }

    // 删除元素data
    public boolean remove(T data) {
        boolean ret = false;
        Node<T> a = headNode;
        while (a.next != null) {
            if (a.next.data == data) {
                a.next = a.next.next;
                ret = true;
                break;
            }
            a = a.next;
        }
        size--;
        return ret;
    }

    // 删除元素data
    public boolean removeAt(int index) {
        boolean ret = false;
        if (index >= 0 && index < size) {
            Node<T> a = headNode;
            int i = -1;
            while (i < index - 1) {
                a = a.next;
                i++;
            }
            size--;
            a.next = a.next.next;
        } else {
            throw new RuntimeException("超出数据范围:" + index);
        }

        return ret;
    }

    // -1是头节点,没有数据
    public Node<T> get(int index) {
        if (index < 0 || index >= size) {
            throw new RuntimeException("超出数据范围:" + index);
        }

        return getHide(index);
    }

    // -1是头节点,没有数据
    private Node<T> getHide(int index) {
        int i = -1;
        Node<T> ret = headNode;
        while (i < index) {
            ret = ret.next;
            i++;
        }
        return ret;
    }

    public void print() {
        Node<T> t = headNode;
        int i = 0;
        while (t.next != null) {
            t = t.next;
            System.err.println(t.data);
            i++;
            if (i > 100)
                break;
        }
        System.err.println("长度为:" + i);
    }
}


最后是测试的代码:

package ListExercise;

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

        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        for (int i = 0; i < 10; i++) {
            linkedList.add(i);
        }

        linkedList.print();
        linkedList.insert(10,10);
        linkedList.remove(1);
        linkedList.removeAt(0);

        linkedList.print();
    }
}

最后,双向链表和循环链表和单链表基本差不多就不一一举例了。

上一篇下一篇

猜你喜欢

热点阅读