題意:大體是最尾節點(tail)移動到頭節點,移動k次。spa
思路:@方法一(我起初的思路);先遍歷一遍鏈表,獲得其長度,用len對k取模(目的是想減小沒必要要的移動操做,好比一個鏈表長爲3,k爲4,其實只須要移動4%3次)。而後就是將尾節點移動到頭節點的操做,具體操做見代碼。指針
@方法二:基本上無異,有區別的是這個思路是將倒數k(k已經處理過)個數據一塊移到頭部去,具體實現見代碼,另附上思惟圖code
差別點:須要注意,第一個思路,一個一個移動須要增長虛擬節點(我習慣稱爲top節點),第二個思路則不須要用到。第二個代碼的first、second是爲了找到倒數第k+1個節點,而後將後面k個節點所有移到頭部。這叫作雙指針法,找倒數第k個節點。blog
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode rotateRight(ListNode head, int k) { if(head==null) return head; ListNode p = head,q,top = new ListNode(-1); top.next = head; int len = 0; while(p!=null) {len++; p=p.next;} k %= len; while(k-->0){ p = top; //找到尾節點前面一個位置 while(p.next.next!=null) {p=p.next;} q = p.next; p.next = q.next; q.next = top.next; top.next = q; } return top.next; } }
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode rotateRight(ListNode head, int k) { if(head==null) return head; ListNode first=head ,second=head; int len = 0; for(ListNode p=head;p!=null;p=p.next) len++; k %= len; //先讓first移動k次 while(k-->0) first = first.next; //first、second同時移動 while(first.next!=null) { first=first.next; second=second.next; } first.next = head; head = second.next; second.next = null; return head; } }