LeetCode -- 61. Rotate List

 

題意及思路

題意:大體是最尾節點(tail)移動到頭節點,移動k次。spa

思路:@方法一(我起初的思路);先遍歷一遍鏈表,獲得其長度,用len對k取模(目的是想減小沒必要要的移動操做,好比一個鏈表長爲3,k爲4,其實只須要移動4%3次)。而後就是將尾節點移動到頭節點的操做,具體操做見代碼。指針

@方法二:基本上無異,有區別的是這個思路是將倒數k(k已經處理過)個數據一塊移到頭部去,具體實現見代碼,另附上思惟圖code

差別點:須要注意,第一個思路,一個一個移動須要增長虛擬節點(我習慣稱爲top節點),第二個思路則不須要用到。第二個代碼的first、second是爲了找到倒數第k+1個節點,而後將後面k個節點所有移到頭部。這叫作雙指針法,找倒數第k個節點。blog

 

代碼1

/**
 * 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;
    }
}
相關文章
相關標籤/搜索