61. Rotate List
方法一:做k次rotation。
1.corner case需要考虑
2.当k远远大于的计算量的时候,记得算出链表长度并对长度求余。
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null) return null;
if(head.next == null) return head;
int n = 0;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode cur = head;
while(cur != null){
n++;
cur = cur.next;
}
k %= n;
for(int i = 0; i < k; i++){
ListNode pre = dummy;
ListNode last = dummy.next;
while(last.next != null){
pre = pre.next;
last = last.next;
}
last.next = dummy.next;
dummy.next = last;
pre.next = null;
}
return dummy.next;
}
}
方法二:
原理是先遍历整个链表获得链表长度 i ,然后此时把链表头和尾链接起来,在往后走i - k % i个节点就到达新链表的头结点前一个点,这时把 Slow的下一个节点是头节点。
时间复杂度和空间复杂度都快很多。
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null) return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode fast = dummy, slow = dummy;
int i;
for(i = 0; fast.next != null; i++){
fast = fast.next;
}
for(int j = i - k % i; j> 0; j--){
slow = slow.next;
}
fast.next = dummy.next;
dummy.next = slow.next;
slow.next = null;
return dummy.next;
}
}
来源:https://www.cnblogs.com/Afei-1123/p/12190360.html