题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
样例描述
思路
链表题画图,根据图来改变几个指针的指向即可。
- 先求链表长度n,且对k取模,因为移动n次相当于没有移动。
- 求长度过程中可以找到原来尾结点,让原尾结点指向原头结点。
- 新的头结点为n - k 的下一个结点
代码
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null) return head;
int n = 0;
ListNode p = head, tail = head;
//求原链表长度 同时记录尾结点
while(p != null) {
tail = p;
p = p.next;
n ++;
}
//取模 避免不必要移动
k = k % n;
if (k == 0) return head;
tail.next = head;
//找到第n - k个结点 就是移动n - k - 1次
p = head;
for (int i = 0; i < n - k - 1; i ++ ) {
p = p.next;
}
head = p.next;
p.next = null;
return head;
}
}