61. Rotate List #
题目 #
给定链表头节点head
,旋转链表,将链表每个节点向右移动k
个位置。
思路 #
- 使用指针
ptr
统计链表长度n
。 - 若
k % n == 0
,等价于不旋转链表。 - 将链表尾部节点
rear
与头节点head
相连,即ptr.next = head
,链表构成环。 - 设给定链表长度为
n
,将链表每个节点向右移动k
个位置,等价于将链表每个节点向右移动k%n
个位置。此时第n+1-k%n
个节点将作为newHead
。 - 令
ptr
指向第n-k%n
个节点,在此处令ptr.next = null
以断开环,并返回newHead
。
代码 #
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (head == null) return null;
ListNode ptr = head;
int length = 1;
while (ptr.next != null) {
ptr = ptr.next;
length += 1;
}
if (k % length == 0) return head;
ptr.next = head;
for (int i=0; i<length - k % length, i++) ptr = ptr.next;
ListNode newHead = ptr.next;
ptr.next = null;
return newHead;
}
}