zoukankan      html  css  js  c++  java
  • LeetCode之“链表”: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.

      比较直观的一个解法就是先求出链表长度,然后再确定从头节点位移到分割节点处的步数。接下来就是分割链表和拼接了。具体程序(8ms)如下:

     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 || !head->next || k == 0)
    13             return head;
    14             
    15         int len = 0;
    16         ListNode *start = head;
    17         while(start)
    18         {
    19             len++;
    20             start = start->next;
    21         }
    22         k = len - k % len;
    23         if(k == 0 || k == len)
    24             return head;
    25             
    26         ListNode *dummy = new(nothrow) ListNode(INT_MIN);
    27         assert(dummy);
    28         
    29         start = head;
    30         for(int i = 0; i < k - 1; i++)
    31             start = start->next;
    32         
    33         dummy->next = start->next;
    34         start->next = nullptr;
    35         
    36         start = dummy;
    37         while(start->next)
    38             start = start->next;
    39         start->next = head;
    40         
    41         head = dummy->next;
    42         delete dummy;
    43         dummy = nullptr;
    44         
    45         return head;
    46     }
    47 };

      这题还有另一个很巧妙的解法:首先从head开始跑,直到最后一个节点,这时可以得出链表长度len。然后将尾指针指向头指针,将整个圈连起来,接着往前跑len – k%len,从这里断开,就是要求的结果了。

      具体程序(12ms)如下:

     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 || !head->next || k == 0)
    13             return head;
    14             
    15         int len = 1;
    16         ListNode *start = head;
    17         while(start->next)
    18         {
    19             len++;
    20             start = start->next;
    21         }
    22         k = len - k % len;
    23         if(k == 0 || k == len)
    24             return head;
    25         
    26         start->next = head;
    27         for(int i = 0; i < k; i++)
    28             start = start->next;
    29         
    30         head = start->next;
    31         start->next = nullptr;
    32 
    33         return head;
    34     }
    35 };
  • 相关阅读:
    使用SetTimer函数为Delphi的Win控件设置时钟
    关于QT版本的安装配置的一些困惑
    Linux设备驱动开发详解-Note(11)--- Linux 文件系统与设备文件系统(3)
    邪恶的C++
    TControl的主要功能研究(属性,函数,事件)
    Delphi研究,对全局变量函数与OOP编程关系的一点体会 good
    QT 相关资源(书籍、论坛、博客等。。。)整理
    VC UI界面库大集合
    .net程序员求职简历
    C++著名程序库的比较
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4604229.html
Copyright © 2011-2022 走看看