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; } }