知识点

链表

题意分析

链表循环右移k位,链表长度为n,那么右移k次和右移k%n次的效果相同。

因此虽然k的范围很大,但是取模之后 k % n<n

相当于把链表的后k%n个元素移到链表的头部,这里实现上可以用两个指针,一个先移动k%n次,然后两个一起移动,当前面的移动到了末尾,前面的指针就到了倒数第k%n的位置,从这里接到链表头部即可。

时间复杂度

只需要遍历链表若干次,时间复杂度O(n)

AC code (C++)

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <climits>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* rotateLeft(ListNode* head, int k) {
        // write code here
        int sz = len(head);
        k %= sz;
        if (!k) return head;
        auto p = head, q = head;
        for (int i = 0; i < k; i ++ ) {
            p = p->next;
        }
        while (p->next) {
            p = p->next;
            q = q->next;
        }
        auto res = q->next;
        q->next = nullptr;
        p->next = head;
        return res;
    }
    int len(ListNode* p) {
        int ret = 0;
        while (p) {
            ret += 1;
            p = p->next;
        }
        return ret;
    }
};