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