📅  最后修改于: 2023-12-03 14:43:04.489000             🧑  作者: Mango
在使用链表时,有时需要重新排序或旋转链表以满足特定需求。这里介绍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程序可以很方便地对链表进行排序和旋转。在排序时,可以使用各种排序算法,例如归并排序等。在旋转时,需要找到链表的头结点和尾结点,并计算出新链表的头结点。