欢迎访问宙启技术站
智能推送

如何使用Java函数实现双向链表?

发布时间:2023-06-01 12:46:57

双向链表是一种链式数据结构,与单向链表相比,双向链表中每个节点除了一个后继指针以外,还有一个前驱指针,因此可以从前向后或从后向前遍历整个链表。

在Java中,我们可以使用类来实现双向链表。具体步骤如下:

1. 定义一个节点类:Node

class Node{
    int data;
    Node prev; // 前驱指针
    Node next; // 后继指针
    public Node(int data){
        this.data = data;
        this.prev = null;
        this.next = null;
    }
}

2. 定义一个双向链表类:DoubleLinkedList

class DoubleLinkedList{
    Node head; // 链表的头节点
    public DoubleLinkedList(){
        head = null;
    }
    // 在链表头部插入节点
    public void addFirst(int data){
        Node node = new Node(data);
        if(head == null){
            head = node;
        }else{
            node.next = head;
            head.prev = node;
            head = node;
        }
    }
    // 在链表尾部插入节点
    public void addLast(int data){
        Node node = new Node(data);
        if(head == null){
            head = node;
        }else{
            Node temp = head;
            while(temp.next != null){
                temp = temp.next;
            }
            temp.next = node;
            node.prev = temp;
        }
    }
    // 删除节点
    public void deleteNode(Node node){
        if(head == null){
            return;
        }
        if(node == head){
            head = head.next;
            head.prev = null;
        }else{
            Node prevNode = node.prev;
            prevNode.next = node.next;
            if(node.next != null){
                node.next.prev = prevNode;
            }
        }
    }
    // 在指定位置插入节点
    public void addNode(int pos, int data){
        Node node = new Node(data);
        if(head == null){
            head = node;
        }else{
            Node temp = head;
            while(pos > 1){
                temp = temp.next;
                pos--;
            }
            node.prev = temp;
            node.next = temp.next;
            temp.next = node;
            if(node.next != null){
                node.next.prev = node;
            }
        }
    }
    // 打印整个链表
    public void printList(){
        Node temp = head;
        while(temp != null){
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
        System.out.println();
    }
}

在DoubleLinkedList类中,我们实现了以下四个方法:

- addFirst(int data): 在链表头部插入节点;

- addLast(int data): 在链表尾部插入节点;

- deleteNode(Node node): 删除指定节点;

- addNode(int pos, int data): 在指定位置插入节点。

此外,我们还实现了一个方法printList(),用于打印整个链表。

下面是一个简单的测试代码:

public class Test {
    public static void main(String[] args) {
        DoubleLinkedList list = new DoubleLinkedList();
        list.addFirst(1);
        list.addFirst(2);
        list.addLast(3);
        list.addNode(2, 4);
        list.printList(); // 2 1 4 3
        list.deleteNode(list.head.next);
        list.printList(); // 2 4 3
    }
}

在这个测试代码中,我们首先创建了一个双向链表list,然后分别使用addFirst()、addLast()和addNode()方法插入了四个节点,最后通过printList()方法打印整个链表。接着使用deleteNode()方法删除了第二个节点,再次调用printList()方法打印整个链表,可以看到第二个节点已经被删除。