Java 题解 | #牛群旋转#

牛群旋转

https://www.nowcoder.com/practice/5137e606573843e5bf4d8ea0d8ade7f4

本题考察的是链表、指针,看到题目有一个空间想象即可。

代码解释:

  • 创建ListNode类:定义了表示链表节点的类,包含一个整数val和指向下一个节点的指针next。
  • 创建CowMovement类:包含了静态方法moveKPositions,用于实现牛群向右移动K个位置。
  • moveKPositions方法的实现步骤:
  • 如果链表为空或k等于0,直接返回原链表头节点。
  • 计算链表的长度。计算实际需要移动的位置,即将k取模链表长度。
  • 如果不需要移动,直接返回原链表头节点。
  • 使用快慢指针的方法,找到需要断开的位置。
  • 将链表断开并重新连接,形成新的链表。
  • 返回新链表的头节点。
  • getLength方法:用于计算链表的长度,遍历链表并计数。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    public ListNode rotateLeft (ListNode head, int k) {
        // write code here
        // 如果链表为空或k等于0,直接返回原链表头节点
        if (head == null || k == 0) {
            return head;
        }

        // 计算链表长度
        int length = getLength(head);

        // 计算实际需要移动的位置
        k = k % length;

        // 如果不需要移动,直接返回原链表头节点
        if (k == 0) {
            return head;
        }

        // 找到需要断开的位置
        ListNode slow = head;
        ListNode fast = head;
        while (k > 0) {
            fast = fast.next;
            k--;
        }

        // 移动fast指针到链表末尾,同时移动slow指针
        while (fast.next != null) {
            slow = slow.next;
            fast = fast.next;
        }

        // 将链表断开并重新连接
        ListNode newHead = slow.next;
        slow.next = null;
        fast.next = head;

        return newHead;
    }

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

全部评论

相关推荐

01-29 16:08
已编辑
华南农业大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务