[LeetCode] Rotate List

Rotate List

Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL.

Time Complexity
计算LinkedList长度: O(N)
O(N) + O(N) + O(N) = O(N)
Space Complexity
O(1)

思路

这题在做之前有很多地方没有写清楚,所以要做好clarify。如果k == 0, k == len的话,是不需要反转的。这里的k是一个circular的概念,如果超过了LinkedList的长度,就用k % len。为了让代码更好写,一开始直接定义好n == k % len,这样不管k是不是大于LinkedList的长度都这么算。

重新连接链表的题目,肯定要找到这个要操作的node的之前的那个node。因为这个prenode之后会变成tail,所以要把rotateNode,也就是newHead保存一下,不能在这里就让preNode.next = null。这样就改变了原先的链表,后面的node的找不到了,之后的操作都会发生nullpointerExxceptions。

再找到整个链表的最后一个Node,为了让这个lastNode和原本的head接起来。

接好之后不要忘记把preNode.next = null,否则整个链表是个环

如果用slow, fast那种方法,找pre和last只要遍历一遍就可以了。

代码

public ListNode rotateRight(ListNode head, int k) {
    //corner case
    if(head == null || head.next == null) return head;
    int len = getLen(head);
    //if k == len, the list wont' reverse
    int n = k % len;
    if(n == 0) return head;
    
    ListNode dummy = new ListNode(0);
    
    dummy.next = head;
    ListNode pre = dummy;
    ListNode last = dummy;
    //find the node pre the rotate node
    for(int i = 0; i < len - n; i++){
        pre = pre.next;
    }
    ListNode rotateNode = pre.next;
    
    //find the last node
    for(int i = 0; i < len; i++){
        last = last.next;
    }
    last.next = head;
    pre.next = null;
    return rotateNode;
}

你可能感兴趣的:(leetcode,LintCode)