首先看一下题目
找到我们的旋转点,然后旋转,是不是想起了之前做过的二分旋转,哈哈
好了,废话少说,开始了。
3、正文
好了,来一起看一下。
依旧还是双指针,这种有间隔的链表,大多数都是双指针。
先让快指针走 k
个位置,然后两个指针一起走完整个链表。
这时,两个指针之间的区域就是我们要移动的区域,只要更改指针指向,就完事了。
first->next
指向 head
,完成旋转(当然还没完事);head
指向 second->next
,头结点指向确认;second->next
指向空节点,尾结点指向确认;记得返回头结点。
4、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head) return NULL;
int n=0;
for(auto p=head;p;p=p->next) n++;
k%=n;
auto first=head,second=head;
while(k--){
first=first->next;
}
while(first->next){
first=first->next;
second=second->next;
}
first->next=head;
head=second->next;
second->next=NULL;
return head;
}
};