Java循环右移

在编程中,循环右移是一种常见的操作,特别是在处理数组或链表时。循环右移即将数组或链表中的元素向右移动指定的位置,超出边界的元素则移到数组或链表的开头。在本文中,我们将介绍如何在Java中实现循环右移操作,并提供代码示例。

实现思路

实现循环右移的关键是找到合适的移动位置和移动方式。对于数组来说,可以通过反转数组和再次反转的方式实现循环右移。对于链表来说,可以先遍历链表找到倒数第k个节点,并将其设置为新的头节点。

Java代码示例

数组循环右移

下面是一个简单的Java代码示例,用于实现数组循环右移:

public void rotateArray(int[] nums, int k) {
    k = k % nums.length;  // 处理k大于数组长度的情况
    reverse(nums, 0, nums.length - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
}

private void reverse(int[] nums, int start, int end) {
    while (start < end) {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}

链表循环右移

下面是一个简单的Java代码示例,用于实现链表循环右移:

public ListNode rotateRight(ListNode head, int k) {
    if (head == null || head.next == null || k == 0) {
        return head;
    }
    
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    
    int len = 1;
    while (head.next != null) {
        head = head.next;
        len++;
    }
    
    head.next = dummy.next;
    
    int move = len - k % len;
    for (int i = 0; i < move; i++) {
        head = head.next;
    }
    
    dummy.next = head.next;
    head.next = null;
    
    return dummy.next;
}

流程图

下面是一个流程图,展示了数组循环右移的过程:

flowchart TD
    A(开始)
    B(处理k大于数组长度的情况)
    C(反转整个数组)
    D(反转前k个元素)
    E(反转后n-k个元素)
    F(结束)

    A --> B --> C --> D --> E --> F

结论

通过以上代码示例和流程图,我们可以清晰地了解如何在Java中实现数组和链表的循环右移操作。在编程实践中,我们可以根据具体需求选择合适的实现方式,并根据情况处理边界情况,确保代码的正确性和稳定性。希望本文能帮助读者更好地理解和应用循环右移操作。