LeetCode No.61 Rotate List

题目:将链表的后k个节点转到前面,这k个节点的顺序保持不变,其中k为非负数。

这是一道双指针方法的题,思路本身并不难,这道题的难点是代码的鲁棒性!

思路:

  1. 创建两个指针,他们之间相差k步;
  2. 同时递进两个指针,直到第二个指针的next指向nullptr,这时我们就确定了要旋转的区间;
  3. 旋转链表;

鲁棒性:

  • 首先就是head为nullptr时,代码不能崩溃;
  • 题目中说k是非负数,那么k为0时程序不能崩溃,且结果要正确(也就是链表不变),k大于等于链表的长度时呢?

我们直接来看代码:

/**
 * 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) 
    {
        //处理head为nullptr时以及k小于0时的情况
        if(!head || k < 0) return nullptr;
        
        //使用两个指针来确定需要旋转的范围
        ListNode *s = head;
        ListNode *e = head;
        //先将e递进k步
        for(int i = 0; i < k; ++i)
        {
            e = e->next;
            //需要处理k超过链表长度的情况
            if(!e)
            {
                k %= (i + 1);
                e = head;
                i = -1;
            }
        }
        //k为0,或者k为链表长度的整数倍
        if(e == head) return head;
        
        //确定需要旋转的区间
        while(e->next != nullptr)
        {
            s = s->next;
            e = e->next;
        }
        //旋转
        e->next = head;
        head = s->next;
        s->next = nullptr;
        
        return head;
    }
};

下面是运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值