• 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 };
  • 相关阅读:
    List--使用List作为堆栈和队列
    Range的范围
    异常处理
    关于打印输出的一些方法
    关于set的unordered特性
    面向对象
    函数
    Linux中命令备份mysql形成文件
    局域网内Linux下开启ftp服务的“曲折路”和命令复习
    linux下的apache服务自启动的几种方式
  • 原文地址:https://www.cnblogs.com/flowerkzj/p/3616555.html
Copyright © 2020-2023  润新知