zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Linq-单条数据删除
    斐波那契额数列及青蛙跳台阶问题
    旋转数组的最小数字
    扑克牌的顺子
    qsort(),sort()排序函数
    从尾到头打印链表
    查找链表中倒数第k个结点
    左旋转字符串
    数组前半部分和后半部分有序的全排序
    二元树中和为某一值的所有路径
  • 原文地址:https://www.cnblogs.com/dysjtu1995/p/12246002.html
Copyright © 2011-2022 走看看