1. 程式人生 > >Leetcode演算法Java全解答--61. 旋轉連結串列

Leetcode演算法Java全解答--61. 旋轉連結串列

Leetcode演算法Java全解答–61. 旋轉連結串列

文章目錄

題目

給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: 1->2->3->4->5->NULL, k = 2
輸出: 4->5->1->2->3->NULL
解釋:
向右旋轉 1 步: 5->1->2->3->4->NULL
向右旋轉 2 步: 4->5->1->2->3->NULL
示例 2:

輸入: 0->1->2->NULL, k = 4
輸出: 2->0->1->NULL
解釋:
向右旋轉 1 步: 2->0->1->NULL
向右旋轉 2 步: 1->2->0->NULL
向右旋轉 3 步: 0->1->2->NULL
向右旋轉 4 步: 2->0->1->NULL

想法

先把連結串列程式設計一個環,然後算出要移動的位數(k%length),

把頭位置往後移k位,把頭位置的前一位的下一位變成null

比如: 12345null,–> 1234512345123…

這時候頭位置還是1,往後移動k,頭位置變成4,頭位置的前一位3的下一位變成null,

結果就是45123null

結果

超過98%的測試案例

時間複雜度/空間複雜度:n/1

總結

程式碼

我的答案


  /**************************************
   * 題目
   給定一個連結串列,旋轉連結串列,將連結串列每個節點向右移動 k 個位置,其中 k 是非負數。

   示例 1:

   輸入: 1->2->3->4->5->NULL, k = 2
   輸出: 4->5->1->2->3->NULL
   解釋:
   向右旋轉 1 步: 5->1->2->3->4->NULL
   向右旋轉 2 步: 4->5->1->2->3->NULL
   示例 2:

   輸入: 0->1->2->NULL, k = 4
   輸出: 2->0->1->NULL
   解釋:
   向右旋轉 1 步: 2->0->1->NULL
   向右旋轉 2 步: 1->2->0->NULL
   向右旋轉 3 步: 0->1->2->NULL
   向右旋轉 4 步: 2->0->1->NULL
   **************************************/

  /*************************************
   想法:
   先把連結串列程式設計一個環,然後算出要移動的位數(k%length),

   把頭位置往後移k位,把頭位置的前一位的下一位變成null

   比如: 12345null,-->   1234512345123...
   這時候頭位置還是1,往後移動k,頭位置變成4,頭位置的前一位3的下一位變成null,
   結果就是45123null

   我的做法
   超過98%的測試案例
   時間複雜度/空間複雜度:n/1
   程式碼執行過程:

   總結:

   ************************************/
  public ListNode rotateRight(ListNode head, int k) {
    if (head == null || head.next == null) {
      return head;
    }
    // 連結串列長度
    int count = 1;
    ListNode cur = head;
    while (cur.next != null) {
      ++count;
      cur = cur.next;
    }
    // 下一一步結束之後,已經首位相連了,
    cur.next = head;
    // 判斷要移動的個數
    count = count - k % count;
    for (int i = 0; i < count; ++i) {
      cur = cur.next;
    }
    ListNode newhead = cur.next;
    cur.next = null;
    return newhead;
  }

大佬們的答案

/**************************************
   * 比我好的答案 better
   * ***********************************/
  public ListNode better(ListNode head, int k) {
    if (head == null) {
      return null;
    }
    ListNode p = head;
    int n = 0;
    while (p != null) {
      n++;
      p = p.next;
    }
    k = k % n;
    p = head;
    for (int i = 0; i < k; i++) {
      p = p.next;
    }
    ListNode slow = head;
    while (p.next != null) {
      p = p.next;
      slow = slow.next;
    }
    p.next = head;
    p = slow.next;
    slow.next = null;

    return p;
  }

測試用例


其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060