Link: https://oj.leetcode.com/problems/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.
1 找出数组长度。2 找出断开位置。3 把old tail连上old head。但是做错了。
我的第一遍代码:
public class Solution {
public ListNode rotateRight(ListNode head, int n) {
if(head == null || head.next == null || n == 0) return head;
//first find out the length of the list
ListNode cur = head;
int len = 0;
while(cur != null){
cur = cur.next;
len ++;//len = 5
}
//move cur to the new head
cur = head;
for(int i = 1; i < len - n; i++){
cur = cur.next;
}
ListNode newHead = cur.next;
cur.next = null;
ListNode tail = newHead;
while(tail.next != null){
tail = tail.next;
}
tail.next = head;
return newHead;
}
}
Input: | {1,2}, 2 |
Output: | {2,1} |
Expected: | {1,2} |
正确的思路:上述第2, 3步交换顺序。1 找出数组长度。2 把old tail连上old head。3 断开。
注意:n 可能大于链表长度,所以要用len - n % len (而不是len - n)
Time: O(n), Space: O(1)
public class Solution {
public ListNode rotateRight(ListNode head, int n) {
if(head == null || head.next == null || n == 0) return head;
//first find out the length of the list
ListNode cur = head;
int len = 1;
while(cur.next != null){
len ++;
cur = cur.next;
}
//connect tail to head to make a circle
cur.next = head;
for(int i = 0; i < len - n%len; i++){
cur = cur.next;
}
ListNode newHead = cur.next;
cur.next = null;
return newHead;
}
}