图解LeetCode刷题计划
1、写在前面
手绘漫画系列正式上线!!!“图解LeetCode刷题计划” 来了!!!
今天是第十八期,争取每天一期,最多两天一期,欢迎大家监督我。。。
最近一段时间,依旧是链表~
我就是个鸽子。。。
2、题目
首先看一下题目,
找到我们的旋转点,然后旋转,是不是想起了之前做过的二分旋转,哈哈
好了,废话少说,开始了。
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;
}
};
如果有幸帮到你,请帮我点个【赞】,给个【关注】!如果能顺带【评论】给个鼓励,我将不胜感激。
如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~