• Rotate List leetcode


    这个题很有意思,看题目可以想到利用循环链表,将链表构成一个环后,旋转一定角度后,然后再拆开环,就可以得到新的链表

    这里需要注意的就是k值和链表长度的关系,我们可以将环看做钟表,链表长度n就是这个钟表的最大刻度,k值是指针走过的刻度,k值可以比n小,也可以比n大,因为钟表环形循环的特点,指针可能已经绕了钟表好几周,这几周可以完全省略掉,只取余数k % n就是指针走过的有效刻度。

    我们如何得到新的头结点呢,联想到钟表,我们假设原来头结点在0刻度上,旋转后,原来 -k%n 刻度来到了0刻度的位置上,只要取链表头结点前面k%n个位置的结点就可以了,但是我们显然不能回退链表,这是个单链表,我们可以利用链表循环的特点,取之后 n - k % n 个位置。找到新的头结点后,我们再想办法找到它前面的节点就是新的尾结点。

    思路清楚后,我不假思索,代码一气呵成,没有改动和debug直接贴到leetcode上就AC了,瞬间成就感爆棚啊!

    ListNode* rotateRight(ListNode* head, int k) {
            if (head == nullptr)
                return head;
            ListNode *cur = head;
            int num = 1;
            while (cur->next != nullptr) {
                cur = cur->next;
                num++;
            }
            cur->next = head;
            int gap = num - k % num;
            ListNode *tail = nullptr;
            while (gap--) {
                tail = head;
                head = head->next;
            }
            tail->next = nullptr;
            return head;
        }
  • 相关阅读:
    HDU5171 GTY's birthday gift —— 矩阵快速幂
    UVA10870 Recurrences —— 矩阵快速幂
    HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂
    UVA11551 Experienced Endeavour —— 矩阵快速幂
    D6 I
    亲和串
    Kmp 算法模板 C
    Buy the Ticket
    寒假D3 A Find the Lost Sock
    寒假 D3 D Modular Inverse
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/5084269.html
Copyright © 2020-2023  润新知