思路:如果从视觉上理解,就是从右向走循环数k个数,最后数到的节点就是旋转后的头结点。实现的时候需要利用快慢指针,先让快指循环跑k个节点,然后两个指针同时跑,知道快指针的下一个节点为空,再将快指针的下一个节点设置为原链表的头节点,慢指针的下一个节点作为旋转后的链表的头结点,同时更新慢指针的下一个节点为NULL。
code:
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if(head == NULL)return head;
ListNode * fastP = head, *slowP = head, *p;
while(k--){
fastP = fastP->next;
if(fastP == NULL)
fastP = head;
}
while(fastP->next != NULL){
fastP = fastP->next;
slowP = slowP->next;
}
fastP->next = head;
p = slowP->next;
slowP->next = NULL;
return p;
}
};