【手绘漫画】图解LeetCode之旋转链表(LeetCode 61题)

在这里插入图片描述

图解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~

©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页