zoukankan      html  css  js  c++  java
  • Leetcode OJ: Rotate List

    Rotate List

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

    For example:
    Given 1->2->3->4->5->NULL and k = 2,
    return 4->5->1->2->3->NULL.

    就是给一个循环列表,有个头的链接,求转动k个位置后链接头的变化

    这里的话其实是要找出倒数第k个数的位置,然后在这个位置截开,后面链表接上前面链表的头。

    找出倒数第k个数首先思路用的是快慢指针。

    但是有一个需要考虑的就是k可以很大,因为这个是循环链表(虽然在数据结构上是不循环的。)。

    所以当k比列表长度大时需要进行求余,把实际的要移动的位置确定下来。代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *rotateRight(ListNode *head, int k) {
    12         if (head == NULL || head->next == NULL || k == 0)
    13             return head;
    14         int kstep = 0, istep = 0;
    15         ListNode* p = head;
    16         // 快指针先行
    17         while (p != NULL && kstep < k) {
    18             p = p->next;
    19             kstep++;
    20         }
    21         
    22         // 快指针到达了最结尾
    23         if (p == NULL) {
    24             // 求余看实际位置
    25             k = k % kstep;
    26             // 为0表示不需要转动
    27             if (k == 0)
    28                 return head;
    29             
    30             // 快指针再走一次
    31             p = head;
    32             kstep = 0;
    33             while (p != NULL && kstep < k) {
    34                 p = p->next;
    35                 kstep++;
    36             }
    37         }
    38         
    39         // 快慢指针一起前行
    40         ListNode* subHead = head;
    41         ListNode* preEnd = NULL;
    42         ListNode* preSub = NULL;
    43         while (p != NULL) {
    44             preEnd = p;
    45             p = p->next;
    46             preSub = subHead;
    47             subHead = subHead->next;
    48         }
    49         // 截断然后拼接
    50         preSub->next = NULL;
    51         preEnd->next = head;
    52         return subHead;
    53     }
    54 };
  • 相关阅读:
    Java第十三天,内部类
    Java第十二天,权限修饰符
    Java面向对象基础
    opencv配置(win10+VS2015+opencv3.1)
    malloc函数
    C++用new创建对象和不用new创建对象的区别解析
    字符串匹配KMP算法中Next[]数组和Nextval[]数组求法
    C++将一个数组内容赋给另一个数组
    C++中的const和指针组合
    通过图片对比带给你不一样的KMP算法体验
  • 原文地址:https://www.cnblogs.com/flowerkzj/p/3616555.html
Copyright © 2011-2022 走看看