📜  Java中的链表(1)

📅  最后修改于: 2023-12-03 14:42:59.434000             🧑  作者: Mango

Java中的链表

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。Java中提供了多种实现链表的方式,本文将介绍其中的两种:单链表和双向链表。

单链表

在单链表中,每个节点包含一个数据元素和一个指向下一个节点的指针。最后一个节点指向null,表示链表的结束。

下面是一个简单的单链表的实现:

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

class LinkedList {
    private ListNode head;

    public LinkedList() {
        this.head = null;
    }

    public void add(int val) {
        ListNode newNode = new ListNode(val);

        if (head == null) {
            head = newNode;
        } else {
            ListNode curr = head;
            while (curr.next != null) {
                curr = curr.next;
            }
            curr.next = newNode;
        }
    }

    public void remove(int val) {
        if (head == null) {
            return;
        }
        
        if (head.val == val) {
            head = head.next;
            return;
        }
        
        ListNode curr = head;
        while (curr.next != null && curr.next.val != val) {
            curr = curr.next;
        }
        
        if (curr.next != null) {
            curr.next = curr.next.next;
        }
    }

    public void printList() {
        ListNode curr = head;
        while (curr != null) {
            System.out.print(curr.val + " ");
            curr = curr.next;
        }
        System.out.println();
    }
}

以上代码中,LinkedList类维护了一个头部节点head,并提供了添加节点、删除节点以及打印链表的功能。

使用示例:

LinkedList list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);
list.printList(); // 输出: 1 2 3

list.remove(2);
list.printList(); // 输出: 1 3
双向链表

双向链表和单链表的结构类似,区别在于每个节点不仅包含指向下一个节点的引用,还包含指向前一个节点的引用。

下面是一个简单的双向链表的实现:

class DoubleListNode {
    int val;
    DoubleListNode prev;
    DoubleListNode next;

    DoubleListNode(int val) {
        this.val = val;
        this.prev = null;
        this.next = null;
    }
}

class DoublyLinkedList {
    private DoubleListNode head;
    private DoubleListNode tail;

    public DoublyLinkedList() {
        this.head = null;
        this.tail = null;
    }

    public void add(int val) {
        DoubleListNode newNode = new DoubleListNode(val);

        if (head == null) {
            head = newNode;
            tail = newNode;
        } else {
            newNode.prev = tail;
            tail.next = newNode;
            tail = newNode;
        }
    }

    public void remove(int val) {
        if (head == null) {
            return;
        }

        DoubleListNode curr = head;
        while (curr != null && curr.val != val) {
            curr = curr.next;
        }

        if (curr != null) {
            if (curr.prev != null) {
                curr.prev.next = curr.next;
            } else {
                head = curr.next;
            }

            if (curr.next != null) {
                curr.next.prev = curr.prev;
            } else {
                tail = curr.prev;
            }
        }
    }

    public void printList() {
        DoubleListNode curr = head;
        while (curr != null) {
            System.out.print(curr.val + " ");
            curr = curr.next;
        }
        System.out.println();
    }
}

以上代码中,DoublyLinkedList类维护了头部节点head和尾部节点tail,并提供了添加节点、删除节点以及打印链表的功能。

使用示例:

DoublyLinkedList list = new DoublyLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.printList(); // 输出: 1 2 3

list.remove(2);
list.printList(); // 输出: 1 3

以上就是Java中链表的简单介绍,希望能对你理解和应用链表数据结构有所帮助。