📅  最后修改于: 2023-12-03 15:42:08.028000             🧑  作者: Mango
本程序是一个用Java编写的链表顺时针旋转算法,旨在帮助程序员快速学习链表旋转操作,提高编程能力。
本程序采用Java编写,利用链表的基本操作实现顺时针旋转。下面是程序的具体实现过程:
rotateRight(ListNode head, int k)
此方法实现链表顺时针旋转的核心,其中参数head
表示链表的头节点,k
表示需要旋转的次数。
public ListNode rotateRight(ListNode head, int k) {
if (head == null || head.next == null || k == 0) {
return head;
}
// 1. 遍历链表获取链表长度
ListNode p = head;
int len = 0;
while (p != null) {
p = p.next;
len++;
}
// 2. 计算真实需要旋转的次数
k = k % len;
if (k == 0) {
return head;
}
// 3. 快慢双指针
ListNode fast = head, slow = head;
// 快指针先走k步
for (int i = 0; i < k; i++) {
fast = fast.next;
}
// 快慢指针一起走,直到快指针到达链表末尾
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
// 4. 翻转链表,链表尾接到链表头
ListNode newHead = slow.next;
slow.next = null;
fast.next = head;
return newHead;
}
printList(ListNode head)
此方法用于打印链表,便于调试。
public void printList(ListNode head) {
if (head == null) {
return;
}
ListNode p = head;
while (p != null) {
System.out.print(p.val + "->");
p = p.next;
}
System.out.println("null");
}
程序中采用了一个自定义的链表节点类ListNode
作为数据结构。
public class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
使用本程序非常简单,只需要定义一个链表的头节点,调用rotateRight
方法即可实现链表顺时针旋转。以下为示例代码:
public static void main(String[] args) {
// 定义链表
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
// 打印初始链表
Solution solution = new Solution();
System.out.println("初始链表:");
solution.printList(head);
// 顺时针旋转2次
head = solution.rotateRight(head, 2);
// 打印旋转后的链表
System.out.println("旋转后的链表:");
solution.printList(head);
}
本程序实现了链表顺时针旋转的基本操作,希望可以帮助程序员更快地学习链表的相关操作,提高编程能力。