Java双向链表排序

双向链表(Doubly Linked List)是一种常见的数据结构,它可以在单链表的基础上提供双向遍历的能力。在Java中,我们可以使用自定义的双向链表来实现各种操作,包括排序。

双向链表的定义和基本操作

首先,让我们来看一下双向链表的定义和基本操作。在Java中,可以通过定义一个Node类来表示链表的节点,每个节点包含一个数据元素和两个指针,分别指向前一个节点和后一个节点。

class Node {
    int data;
    Node prev;
    Node next;
    
    public Node(int data) {
        this.data = data;
        this.prev = null;
        this.next = null;
    }
}

在双向链表中,我们还需要定义一个head节点和一个tail节点,它们分别指向链表的第一个节点和最后一个节点。我们可以使用这两个节点来实现链表的各种操作,包括插入、删除和排序。

class DoublyLinkedList {
    Node head;
    Node tail;
    
    public DoublyLinkedList() {
        this.head = null;
        this.tail = null;
    }
    
    // 在链表末尾插入一个节点
    public void insert(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            tail = newNode;
        } else {
            newNode.prev = tail;
            tail.next = newNode;
            tail = newNode;
        }
    }
    
    // 从链表中删除一个节点
    public void delete(int data) {
        Node current = head;
        while (current != null) {
            if (current.data == data) {
                if (current == head) {
                    head = current.next;
                }
                if (current == tail) {
                    tail = current.prev;
                }
                if (current.prev != null) {
                    current.prev.next = current.next;
                }
                if (current.next != null) {
                    current.next.prev = current.prev;
                }
                return;
            }
            current = current.next;
        }
    }
    
    // 遍历链表并打印节点的值
    public void print() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }
}

双向链表的排序算法

在双向链表中进行排序的常见算法是插入排序。插入排序的基本思想是将链表分为已排序部分和未排序部分,每次从未排序部分中取出一个节点,插入到已排序部分的适当位置,直到所有节点都被插入到已排序部分为止。

以下是使用插入排序对双向链表进行排序的示例代码:

public void sort() {
    Node current = head;
    while (current.next != null) {
        Node nextNode = current.next;
        int nextData = nextNode.data;
        
        Node prevNode = current;
        while (prevNode != null && prevNode.data > nextData) {
            prevNode.next.data = prevNode.data;
            prevNode = prevNode.prev;
        }
        
        if (prevNode == null) {
            head.data = nextData;
        } else {
            prevNode.next.data = nextData;
        }
        
        current = nextNode;
    }
}

在上述代码中,我们首先获取当前节点的下一个节点和它的值。然后,我们从当前节点的前一个节点开始,将所有大于下一个节点值的节点向后移动一位。最后,我们将下一个节点的值插入到适当的位置。

示例

以下是一个使用双向链表进行排序的示例:

public class Main {
    public static void main(String[] args) {
        DoublyLinkedList list = new DoublyLinkedList();
        list.insert(4);
        list.insert(2);
        list.insert(3);
        list.insert(1);
        list.insert(5);
        
        System.out.println("Before sorting:");
        list.print();
        
        list.sort();
        
        System.out.println("After sorting:");
        list.print();
    }
}

运行以上示例代码,输出结果如下:

Before sorting:
4 2 3 1 5
After sorting:
1 2 3 4 5

可以看到,双向链表中的节点已经按升序排列。

总结

通过定义双向链表和实现排序算法