LeetCode——旋转链表

本文介绍了一个链表旋转算法,该算法能将链表中的每个节点向右移动k个位置,并详细解释了如何确定新的头节点和尾节点。此外,还讨论了当k为链表长度的整数倍时,链表保持不变的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个链表,旋转链表,将链表每个节点向右移动 个位置,其中 是非负数。

示例 1:

示例 2:

关键是找到旋转后哪个点成为头节点(将其返回),哪个点成为尾节点,将其next指针设为NULL

示例2相当于给了一点提示:当循环移动位数等于链表长度的整数倍时,链表不变。

#include<cstdlib>
class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(k == 0 || head == NULL || head->next == NULL)
            return head;
        ListNode *temp = head, *first = NULL, *pre = NULL;
        int size = 0, count = 0, newk;
        while(temp != NULL)
        {
            pre = temp;
            size++;
            temp = temp->next;
        }
        pre->next = head;
        newk = k % size;
        temp = head;
        count = 1;
        while(count < size-newk)
        {
            count++;
            temp = temp->next;
        }   
        first = temp->next;
        temp->next = NULL;
        return first;
        
    }
};

啊,这么慢.................  但是代码不变再提交一次,提升这么多,这个时间还有参考价值吗.........??

还有就是,算出来newk之后可以再判断一次 == 0? 若是直接返回head。

但是提交代码时显示 超时,不懂........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值