java 简单双向链表

package com.test.algorithm.linknode;

/**
 * @Author:
 * @Date: 2021/5/9 16:10
 */
public class MyLinkList<T> {
    class Node<T> {
        T data;
        Node pre;
        Node next;

        public Node() {

        }

        public Node(T data) {
            this.data = data;
        }
    }

    private Node head;
    private Node tail;
    private int length;

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

    public MyLinkList() {
        this.head = null;
        tail = head;
        length = 0;
    }

    void addFirst(T data) {
        Node<T> node = new Node<>(data);
        if (isEmpty()) {
            head = node;
            tail = node;
        } else {
            node.next = head;
            head.pre = node;
            head = node;
        }
        length++;
    }

    /**
     * '尾结点插入法
     *
     * @param data
     */
    void addData(T data) {
        Node<T> node = new Node<>(data);
        if (isEmpty()) {
            head = node;
            tail = node;
        } else {
            tail.next = node;
            node.pre = tail;
            tail = node;
        }
        length++;
    }

    int length() {
        return length;
    }

    T get(int index) {
        Node cur = this.head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return (T) cur.data;
    }

    void add(int index, T data) {
        if (index == 0) {
            addFirst(data);
            return;
        } else if (index == length) {
            addData(data);
            return;
        }
        Node cur = this.head;
        for (int i = 0; i < index - 1; i++) {
            cur = cur.next;
        }
        Node pre = cur;
        Node<T> node = new Node<>(data);
        node.next = pre.next;
        pre.next.pre = node;
        pre.next = node;
        node.pre = pre;
        length++;
    }

    void deleteFirst() {
        if (isEmpty()) {
            return;
        }
        if (length == 1) {
            head = null;
            tail = head;
        } else {
            head.next.pre = null;
            head = head.next;
        }
        length--;
    }

    void deleteLast() {
        if (isEmpty()) {
            return;
        }
        if (length == 1) {
            head = null;
            tail = null;
        } else {
            tail.pre.next = null;
            tail = tail.pre;
        }
        length--;
    }

    void delete(int index) {
        if (index < 0) {
            return;
        }
        if (index == 0) {
            deleteFirst();
            return;
        } else if (index == length) {
            deleteLast();
            return;
        }
        Node pre = this.head;
        for (int i = 0; i < index - 1; i++) {
            pre = pre.next;
        }
        pre.next.next.pre = pre;
        pre.next = pre.next.next;
        length--;
    }

    void set(int index, T data) {
        if (head == null) {
            return;
        }
        Node cur = this.head;
        for (int i = 0; i < index - 1; i++) {
            cur = cur.next;
        }
        cur.data = data;
    }

    String traverse() {
        Node cur = this.head;
        StringBuilder sb = new StringBuilder();
        while (cur != null) {
            sb.append(cur.data + "	");
            cur = cur.next;
        }
        return sb.toString();
    }

    String reverse() {
        Node cur = this.tail;
        StringBuilder sb = new StringBuilder();
        while (cur != null) {
            sb.append(cur.data + "	");
            cur = cur.pre;
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        MyLinkList<Integer> list = new MyLinkList<Integer>();
        list.addData(66);
        list.addFirst(55);
        list.add(1, 101);
        list.addData(-22);
        list.addData(555);
        list.addFirst(9999);
        System.out.println(list.traverse() + " | " + list.reverse());
        list.deleteFirst();
        System.out.println(list.traverse() + "|" + list.reverse());
        list.delete(1);
        System.out.println(list.traverse() + "|" + list.reverse());
        list.delete(1);
        System.out.println(list.traverse() + " " + list.length());
        list.deleteLast();
        System.out.println(list.traverse() + " " + list.length());
        list.deleteLast();
        System.out.println(list.traverse() + " " + list.length());
        list.deleteLast();
        System.out.println(list.traverse() + " " + list.length());
        System.out.println(list.isEmpty());
        list.deleteLast();
    }

}
原文地址:https://www.cnblogs.com/lijiale/p/14748487.html