📜  链表顺时针旋转的Java程序(1)

📅  最后修改于: 2023-12-03 15:42:08.028000             🧑  作者: Mango

链表顺时针旋转的Java程序

本程序是一个用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);
}
结语

本程序实现了链表顺时针旋转的基本操作,希望可以帮助程序员更快地学习链表的相关操作,提高编程能力。