[LeetCode]Rotate List
2016-10-27 20:02
204 查看
Question
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given
return
本题难度Medium。
双指针法
【复杂度】
时间 O(N) 空间 O(1)
【思路】
旋转链表的本质,就是把链表的后半部分放到前面来,所以关键在于如何找链表后半部分的起始节点。实际上,我们用一个快指针先走k步,然后快慢指针同时走,这样当快指针到末尾时,慢指针就到链表后半部分的起始节点了。不过,由于k可能大于链表的长度,所以我们要先对k取链表长度的模。要计算链表长度只要遍历一遍链表就行了。
【注意】
k取余后为0,或者原链表为空的情况下,都要直接返回原链表,不然将慢指针的下一个作为新链表头会出错。
【代码】
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->NULLand
k = 2,
return
4->5->1->2->3->NULL.
本题难度Medium。
双指针法
【复杂度】
时间 O(N) 空间 O(1)
【思路】
旋转链表的本质,就是把链表的后半部分放到前面来,所以关键在于如何找链表后半部分的起始节点。实际上,我们用一个快指针先走k步,然后快慢指针同时走,这样当快指针到末尾时,慢指针就到链表后半部分的起始节点了。不过,由于k可能大于链表的长度,所以我们要先对k取链表长度的模。要计算链表长度只要遍历一遍链表就行了。
【注意】
k取余后为0,或者原链表为空的情况下,都要直接返回原链表,不然将慢指针的下一个作为新链表头会出错。
【代码】
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode rotateRight(ListNode head, int k) { //require if(k==0||head==null) return head; ListNode fast=head; int size=0; //计算链表长度 while(fast!=null){ size++; fast=fast.next; } k=k%size; //取模 fast=head; //fast指针先走k步 for(int i=0;i<k;i++) fast=fast.next; ListNode low=head; //invariant while(fast.next!=null){ fast=fast.next; low=low.next; // 将后半部分放到前面来 fast.next=head; head=low.next; low.next=null; //ensure return head; } }
参考
[Leetcode] Rotate List 旋转链表相关文章推荐
- LeetCode No.61 Rotate List
- leetcode[61]Rotate List
- leetcode之Rotate List
- (java)leetcode-61:Rotate List
- LeetCode算法题目:Rotate List
- LeetCode(61) Rotate List
- <LeetCode OJ> 61. Rotate List
- rotate List|Leetcode c++
- Leetcode——61. Rotate List
- 【leetcode】Rotate List
- LeetCode Rotate List
- [LeetCode]61. Rotate List
- [LeetCode] Rotate List
- [LeetCode]61.Rotate List
- Leetcode-Rotate List
- [LeetCode] Rotate List 解题报告
- leetcode题解-61. Rotate List
- [LeetCode] Rotate List
- leetcode之Rotate List
- 29_leetcode_Rotate List