LeetCode:旋轉鏈表【61】
阿新 • • 發佈:2018-11-03
高效 效率 ati port 問題 etl 分享圖片 sca 移動
LeetCode:旋轉鏈表【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
題目分析
這道題目我用了最笨的方法,我假設每次只向右旋轉一個單位,然後執行N次。
向右旋轉一個單位怎麽處理呢?
找到最後兩個節點,讓最後一個節點的next指向第一個節點,然後倒數第二個節點的next指向空。
處理一個問題,對於循環次數我們可以用求余數來提高效率,比如長度為5,那麽循環10000次也還是原來的就不需要循環。
Java題解
package linklist; import java.util.Scanner; public class RotateList_61 { public static void main(String[] args) { ListNode node1 = new ListNode(1); ListNode node2 = new ListNode(2); ListNode node3 = new ListNode(3); ListNode node4 = new ListNode(4); ListNode node5 = new ListNode(5); node1.next=node2; node2.next=node3; node3.next=node4; node4.next=null; new RotateList_61().rotateRight(node1,2); } public ListNode rotateRight(ListNode head, int k) { if(head==null) return null; int len = getLen(head); for(int i = 0;i<k%len;i++) { head = rotateRight(head); } return head; } public ListNode rotateRight(ListNode head) { ListNode ptrL = head; ListNode ptrR = ptrL.next; if(ptrR==null) return head; while (ptrR.next!=null) { ptrL=ptrL.next; ptrR=ptrR.next; } ptrR.next=head; ptrL.next=null; return ptrR; } public static int getLen(ListNode node) { int count = 0; while (node!=null) { count++; node=node.next; } return count; } }
LeetCode:旋轉鏈表【61】