給定一個鏈表,旋轉鏈表,將鏈表每一個節點向右移動 k 個位置,其中 k 是非負數。如圖:算法
試題連接:https://leetcode-cn.com/problems/rotate-list/指針
爲了完成該算法,在進行代碼編寫時先進行了數學分析,下面照片是數學分析的草稿,圖可能有些醜。code
下面解釋下該圖:blog
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
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語言的提交結果可知,在時間和內存消耗上都較爲通常數學