用Java代码实现双向链表数据结构


/**
 * 优化的双向链表,头节点代表第1个元素。
 * 节点序号从0开头
 *
 * @author hejinxu
 */
public class DoubleLinkedList<T> {
    class Node<T> {// 节点元素
        private Node<T> prev;
        private T data;
        private Node<T> next;

        public Node() {
        }


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

        public T data() {
            return data;
        }

        public Node<T> prev() {
            return prev;
        }

        public Node<T> next() {
            return next;
        }

        boolean isHeader() {
            if (this.equals(header)) {
                return true;
            }
            return false;
        }


    }

    private Node<T> header = null;

    public void insert(T n) {
        Node<T> e = new Node<T>();
        e.data = n;
        if (header == null)// 说明这是第一次插入元素
        {
            header = e;
            header.next = e;
            header.prev = e;
            e.prev = e;
            e.next = e;
            return;
        }

        // 在最后插入元素
        e.next = header;
        e.prev = header.prev;
        header.prev.next = e;
        header.prev = e;

    }

    public void insert(int i, T n)// 在链表的i位置插入元素n
    {
        if (i < 0) {
            System.out.println("插入位置不合法!!!" + "链表长度为:" + size());
            return;
        }

        Node<T> e = new Node();
        e.data = n;
        // 说明这是第一次插入元素,在头结点后面插入元素
        if (header == null) {
            e.prev = e;
            e.next = e;
            header = e;
            header.next = e;
            header.prev = e;
            return;
        }

        // 在最后插入元素
        if (i >= size()) {
            e.prev = header.prev;
            e.next = header;
            header.prev.next = e;
            header.prev = e;
            return;
        }

        if (i == 0) {   //在头节点插入
            e.next = header;
            e.prev = header.prev;
            header.prev.next = e;
            header.prev = e;
            header = e;
            return;
        }

        // 在i位置插入元素
        Node<T> temp = header;
        int count = 0;
        while (temp.next != header) {
            count++;
            if (count == i) {
                e.next = temp.next;
                e.prev = temp;
                temp.next.prev = e;
                temp.next = e;

            }
            temp = temp.next;
        }
    }

    public Node<T> getNode(int i) {
        if (header == null) {
            return null;
        }

        if (i < 0 || i >= size()) {
            System.out.println("输入数据有错!");
            return null;
        }

        int count = -1;
        Node<T> temp = null;
        while (true) {
            count++;
            if (temp == null) {
                temp = header;
            }

            if (count == i) {
                break;
            }

            if (!temp.next.equals(header)) {
                temp = temp.next;
            } else {
                break;
            }
        }
        return temp;
    }

    public T getNodeVal(int i) {
        Node<T> n = getNode(i);
        if (n != null) {
            return n.data;
        }
        return null;
    }

    public int size()// 返回链表的长度
    {
        if (header == null) {
            return 0;
        }

        int count = 0;
        Node<T> temp = header;
        while (true) {
            count++;
            if (temp.next.equals(header)) {
                break;
            }
            temp = temp.next;
        }
        return count;
    }

    void printList() {
        if (header == null) {
            return;
        }
        Node<T> temp = header;
        while (true) {
            System.out.print(temp.data + " ");
            temp = temp.next;
            if (temp.equals(header)) {
                break;
            }
        }
        System.out.println();
    }

    void deleteByIndex(int i)// 删除指定位置上的元素
    {
        if (i < 0 || i >= size()) {
            System.out.println("删除的位置误" + "链表长度为:" + size());
        }

        Node<T> e = getNode(i);
        if (e == header) {

            //当只有一个元素时
            if (e.next.equals(header)) {
                header = null;
                return;
            }

            //当只有两个元素时
            if (e.prev.equals(e.next)) {
                e.next.next = e.next;
                e.next.prev = e.next;
                header = e.next;
                e = null;
                return;
            }

            //当不止两个元素时
            e.prev.next = e.next;
            e.next.prev = e.prev;
            header = e.next;
            return;

        }

        //当删除的不是头节点时
        e.prev.next = e.next;
        e.next.prev = e.prev;
    }

    void deleteByEle(Node<T> element)// 删除链表中指定元素
    {

    }

    public static void main(String[] args) {
        DoubleLinkedList<String> list = new DoubleLinkedList<>();
        list.insert("1永");
        list.insert("2建");
        list.insert("3龙");
        list.insert("4志");
        list.insert("5显");
        list.insert("6文");
        list.insert("7红");
        list.insert("8李");
        list.insert("9杨");
        list.insert("10杰");

        System.out.println("原始链表:");
        list.printList();


        System.out.println(list.getNode(0).prev.isHeader());

        System.out.println(list.getNode(0).prev.data);

        list.insert("张三");
        list.printList();

        System.out.println(list.getNode(0).prev.data);

    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值