leetcode網解題心得——61. 旋轉鏈表

leetcode網解題心得——61. 旋轉鏈表

一、題目描述

給定一個鏈表,旋轉鏈表,將鏈表每一個節點向右移動 k 個位置,其中 k 是非負數。如圖:算法

試題連接:https://leetcode-cn.com/problems/rotate-list/指針

二、算法分析:

爲了完成該算法,在進行代碼編寫時先進行了數學分析,下面照片是數學分析的草稿,圖可能有些醜。code

下面解釋下該圖:blog

  1. 因爲題目是循環列表,能夠將單鏈表進行打斷,組成一個圓圈。而指針所指的方向便是起點。
  2. 模擬循環,由循環後的結果能夠得出,若是循環次數剛好爲一圈時等於沒循環。
  3. 同時,能夠很簡單的看出,k=幾,就至關於順時針轉動k步
  4. 因爲單鏈表只是一側的,在圖上更方便逆時針轉動,所以可計算出逆時針轉動的步數=角-k

三、用天然語言描述該算法

  1. 先求得鏈表的長度,即爲多邊形角度
  2. 遍歷單鏈表,到最後一個位置,而後將指向修改成指向頭結點,打形成環形鏈表
  3. 由分析計算出來的公式,逆時針將輔助指針旋轉角度-k-1步,位於所要的結果前一個
  4. 保存下一個結點,由於打斷後沒法過去,須要先保存
  5. 打斷循環鏈表,返回保存的結點

四、java語言實現

public static ListNode rotateRight(ListNode head, int k) {
        if(head == null) return null;
        //1,須要知道鏈表的長度
        ListNode pCurrent = head;
        int count = 1;
        while(pCurrent.next != null) {
            //計數
            count++;
            //向下
            pCurrent = pCurrent.next;
        }
        //循環結束後,指向的是最後一個結點,對接成循環鏈表
//        System.out.println(count);
        pCurrent.next = head;
        //指向頭,循環鏈表
        pCurrent = pCurrent.next;
        //計算有效循環
        int total = k % count;
        //計算順轉次數
        total = count - total;
//        System.out.println(total);
        for(int i = 1;i < total;i++) {
            pCurrent = pCurrent.next;
        }
        //保存下一個結點
        ListNode saveNode = pCurrent.next;
        pCurrent.next = null;
        return saveNode;
    }

算法效果:內存

算法分析,時間上還行,可是空間上消耗較大。leetcode

五、C語言實現

struct ListNode* rotateRight(struct ListNode* head, int k){
    if(head == NULL) return NULL;
    //1,須要知道鏈表的長度
    struct ListNode* pCurrent = head;
    int count = 1;
    while(pCurrent->next != NULL) {
        //計數
        count++;
        //向下
        pCurrent = pCurrent->next;
    }
    //循環結束後,指向的是最後一個結點,對接成循環鏈表
//        System.out.println(count);
    pCurrent->next = head;
    //指向頭,循環鏈表
    pCurrent = pCurrent->next;
    //計算有效循環
    int total = k % count;
    //計算順轉次數
    total = count - total;
//        System.out.println(total);
    for(int i = 1;i < total;i++) {
        pCurrent = pCurrent->next;
    }
    //保存下一個結點
    struct ListNode* saveNode = pCurrent->next;
    pCurrent->next = NULL;
    return saveNode;
}

算法效果:get

算法分析:根據C語言的提交結果可知,在時間和內存消耗上都較爲通常數學

相關文章
相關標籤/搜索