📜  Java程序计算排序和旋转链表中的旋转(1)

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

Java程序计算排序和旋转链表中的旋转

在使用链表时,有时需要重新排序或旋转链表以满足特定需求。这里介绍Java程序如何计算排序和旋转链表中的旋转。

排序链表

排序链表是指按一定顺序排列链表节点的链表。常见的排序方法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。这里以归并排序为例,介绍Java程序如何对链表进行排序。

public ListNode sortList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode mid = getMid(head);
    ListNode right = mid.next;
    mid.next = null;
    return merge(sortList(head), sortList(right));
}

private ListNode getMid(ListNode head) {
    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
}

private ListNode merge(ListNode left, ListNode right) {
    ListNode dummyHead = new ListNode(0);
    ListNode curr = dummyHead;
    while (left != null && right != null) {
        if (left.val < right.val) {
            curr.next = left;
            left = left.next;
        } else {
            curr.next = right;
            right = right.next;
        }
        curr = curr.next;
    }
    curr.next = left == null ? right : left;
    return dummyHead.next;
}

在上面的程序中,sortList方法使用归并排序将链表排序。getMid方法找到链表的中点,而merge方法将两个有序链表合并成一个有序链表。

旋转链表

旋转链表是指将链表中的节点以某个位置为界限旋转。例如,如果将链表 1->2->3->4->5 以 2 为旋转点旋转,结果为 4->5->1->2->3。Java程序可以通过以下代码实现链表的旋转。

public ListNode rotateRight(ListNode head, int k) {
    if (head == null || head.next == null || k == 0) {
        return head;
    }
    int len = getLength(head);
    k %= len;
    if (k == 0) {
        return head;
    }
    ListNode tail = getTail(head);
    ListNode newHead = getNewHead(head, len - k);
    tail.next = head;
    return newHead;
}

private int getLength(ListNode head) {
    int len = 0;
    while (head != null) {
        len++;
        head = head.next;
    }
    return len;
}

private ListNode getTail(ListNode head) {
    while (head.next != null) {
        head = head.next;
    }
    return head;
}

private ListNode getNewHead(ListNode head, int k) {
    while (k > 1) {
        head = head.next;
        k--;
    }
    ListNode newHead = head.next;
    head.next = null;
    return newHead;
}

在上面的程序中,rotateRight方法接收一个链表和一个整数作为参数,其中整数表示链表的旋转位置。程序首先获取链表的长度,然后计算出旋转后链表的头结点和尾结点,并返回新的链表。

总结

Java程序可以很方便地对链表进行排序和旋转。在排序时,可以使用各种排序算法,例如归并排序等。在旋转时,需要找到链表的头结点和尾结点,并计算出新链表的头结点。