给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
主要思想:
1、先统计链表结点的总数
2、再将链表的尾结点连接到第一个结点
3、再找到链表的倒数第k+1个结点 //通过将从head结点,向后移动n-k+1次即可 (通过定义一个变量值为n-k%n+1即可)
4,断开第k+1个结点和倒数第k个结点的链接
5、返回倒数第k个结点作为新链表的头结点
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (k == 0 || head == null || head.next == null) {
return head;
}
int n = 1;
ListNode iter = head;
while (iter.next != null) {
iter = iter.next;
n++;
}
int add = n - k % n; //n-k
if (add == n) {
return head;
}
iter.next = head;
while(add>0){ //移动一下是倒数第n个,2 n-1移动n下,是倒数第1个 n-k n-(n-k-1)=倒数第K+1个
iter=iter.next;
add--;
}
ListNode new_h = iter.next;
iter.next=null;
return new_h;
// while (add-- > 0) { //add = n-k 向后移动 n-k个
// iter = iter.next;
// }
// ListNode ret = iter.next;
// iter.next = null;
}
}