旋转链表——fgriver

题目

https://leetcode-cn.com/problems/rotate-list/

题解

NA的原因有几个:
1.这里的head是带有val值的
2.判断是否为空指针时顺序写反了
再讲一下思路:
首先看到数据集中k的范围到了2*10^9,所以我们需要将k进行优化,优化的方法就是k = k mod length
那么我们先求这个链表的长度,方法就是从头遍历链表然后取长度(这里注意一下head其实算其中一个节点,与我所学链表不同)
再者就是对k的优化,优化方法前者提到过,之后k = len-k的操作其实就是将k倒置(下文我将讲什么是倒置)
倒置的原因:
我的思路是将链表从表头开始拼接到表尾,然后删除原有的表头,举个例子
假如k=2,链表为1->2->3->4->5;
那么进行了k = k % len; 和 k = len- k;的操作后,k=3,然后进行循环操作
第一次循环: 链表: 2->3->4->5->1;
第二次循环: 链表: 3->4->5->1->2;
第三次循环: 链表: 4->5->1->2->3;

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head==NULL||k==0||head->next==NULL)  return head;//报错原因:将head==NULL与head->next=NULL写反了
        int len=0;
        ListNode* tmp=head;
        while(tmp!=NULL){
            len++;
            tmp=tmp->next;
        }
        k=k%len;
        k=len-k;
        ListNode* last=head;
        while(last->next!=NULL) last=last->next;
        while(k--){
            int x=head->val;//报错原因:head也是有val的
            ListNode* node=new ListNode(x);
            //先把node放在last的后面
            last->next=node;
            last=last->next;
            //再把head后的第一个元素删除
            head=head->next;
        }
        return head;
    }
};

作者:fgriver
链接:https://leetcode-cn.com/problems/rotate-list/solution/xuan-zhuan-lian-biao-fgriver-by-fgriver-2t11/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值