• 61. Rotate List


    Problem:

    Given a linked list, rotate the list to the right by k places, where k is non-negative.

    Example 1:

    Input: 1->2->3->4->5->NULL, k = 2
    Output: 4->5->1->2->3->NULL
    Explanation:
    rotate 1 steps to the right: 5->1->2->3->4->NULL
    rotate 2 steps to the right: 4->5->1->2->3->NULL
    

    Example 2:

    Input: 0->1->2->NULL, k = 4
    Output: 2->0->1->NULL
    Explanation:
    rotate 1 steps to the right: 2->0->1->NULL
    rotate 2 steps to the right: 1->2->0->NULL
    rotate 3 steps to the right: 0->1->2->NULL
    rotate 4 steps to the right: 2->0->1->NULL
    

    思路
    首先算出链表的长度(因为平移的时候以长度为周期重复),然后将链表头尾相连变成循环链表,找到头尾节点即可。

    Solution:

    ListNode* rotateRight(ListNode* head, int k) {
        if (!head) return head;
            
        int len = 1;
        ListNode *newHead, *tail;
        newHead = tail = head;
            
        while (tail->next) {
            tail = tail->next;
            len++;
        }
            
        tail->next = head;  //成为循环链表
            
        k %= len;
        if (k) {
            for (int i = 0; i < len - k; i++) {
                tail = tail->next;          //找到尾节点,将头结点当成第一个节点,则尾节点是第(len-k)个节点
            }
        } 
        newHead = tail->next;
        tail->next = NULL;
        return newHead;
    }
    

    性能
    Runtime: 12 ms  Memory Usage: 9.6 MB

    相关链接如下:

    知乎:littledy

    欢迎关注个人微信公众号:小邓杂谈,扫描下方二维码即可

    作者:littledy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Codevs堆练习
    codevs 3110 二叉堆练习3
    浅谈堆
    codevs 2924 数独挑战
    搜索技巧——持续更新
    2144 砝码称重 2
    codevs 2928 你缺什么
    codevs 2594 解药还是毒药
    codevs 2147 数星星
    判断素数
  • 原文地址:https://www.cnblogs.com/dysjtu1995/p/12246002.html
Copyright © 2020-2023  润新知