Leetcode61:旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
链表中的点已经相连,一次旋转操作意味着:
- 先将链表闭合成环
- 找到相应的位置断开这个环,确定新的链表头和链表尾
如何找到新链表的头节点?
若k<count,其中 count 是链表中点的个数:
在位置 count-k 处,新的链表尾就在头的前面,位于位置 count-k-1。
若 k >= count:
只需要考虑 k%count 的部分,这个值一定比 count 小,k-k%count 这部分肯定是count的整数倍形成换状。
/**
* 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
* @param head
* @param k
* @return
*/
public ListNode rotateRight(ListNode head, int k) {
if(head == null){
return null;
}
//形成闭环
ListNode tail = head;
int count = 1;
while (tail.next != null){
tail = tail.next;
count ++;
}
tail.next = head;
int len;
if(count > k){
len = k;
}else {
len = k % count;
}
int right = count - len;
for(int i=0; i<right; i++){
head = head.next;
tail = tail.next;
}
tail.next = null;
return head;
}