栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Leetcode之61. 旋转链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode之61. 旋转链表

提交记录1

执行结果:

解题思路:

  1. 首先找到k的位置;
  2. 使k到尾指针的段为首段;
  3. 然后使首段的next指向head;
  4. 还有一些特殊情况,比如链表为空、1个节点,或k为len的整数倍,这些情况都直接输出链表,无需变换;
  5. (好吧我承认,特殊情况是我调bug补上来的,感觉自己的方法笨笨的,再去看看别人的方法)

语言:C++

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        while(!head || !head->next) return head;
        
        ListNode*fast=head;
        ListNode*slow=head;

        int len=1;
        ListNode*cur=head;
        while(cur->next){
            cur=cur->next;
            len++;
        }
        k=k%len;
        while(k==len || k==0) return head;

        while(k){
            fast=fast->next;
            k--;
        }

        while(fast->next){
            fast=fast->next;
            slow=slow->next;
        }

        ListNode*temp=slow;
        slow=slow->next;
        temp->next=NULL;
        fast->next=head;

        return slow;

    }
};
提交记录2

执行结果:

解题思路:

  1. 先遍历求得链表总长度count,同时将链表首尾相连;
  2. 再找到原链表的倒数第k+1个节点,该节点的next就是新链表的头结点;
  3. (按照思路自己写一遍代码)

语言:C++

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        //无需变化列表
        while(!head || !head->next || k==0) return head;

        //计算最小k值
        int len=1;
        ListNode*cur=head;
        while(cur->next){
            cur=cur->next;
            len++;
        }
        k=k%len;

        //使链表首尾相连
        cur->next=head;
        //找到起始位置
        int times=len-k;
        while(times){
            cur=cur->next;
            times--;
        }

        //将环形链表转换回单链表
        ListNode*newhead=cur->next;
        cur->next=NULL;

        return newhead;

    }
};
细节提升 1.环形链表

利用环形链表解决完问题,记得将环形链表转换回单链表,否则内存溢出。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853879.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号