LeetCode --- 61. Rotate List
2015-03-15 23:33
309 查看
题目链接:Rotate List
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
这道题的要求是向右旋转链表k步。
其实就是把链表后面l-k个节点放到前面,可以采用快慢指针处理。不过当k大于链表长度l的时候,就会出现问题。这时需要做一点点处理,就是当快指针f指向最后节点后,下一次令其指向头节点,这样问题就解决了。这样的时间复杂度是O(k),因此,当k非常大的时候,会TLE。
考虑到k大于l的时候,可以令k对l取模处理。因此,先计算链表长度,同是令p指向链表最后节点。接下来k对l取模,再令q从头节点往后移动l-k步,这样q就指向要旋转的位置。最后将q后面的节点放到前面即可。
处理的时候,同样先对链表加头,方便处理,类似于Remove
Nth Node From End of List、Swap Nodes in Pairs、Reverse
Nodes in k-Group,同样先对链表加头处理。
时间复杂度:O(l)(l是链表长度)
空间复杂度:O(1)
转载请说明出处:LeetCode --- 61. Rotate List
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
[code]Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL.
这道题的要求是向右旋转链表k步。
其实就是把链表后面l-k个节点放到前面,可以采用快慢指针处理。不过当k大于链表长度l的时候,就会出现问题。这时需要做一点点处理,就是当快指针f指向最后节点后,下一次令其指向头节点,这样问题就解决了。这样的时间复杂度是O(k),因此,当k非常大的时候,会TLE。
考虑到k大于l的时候,可以令k对l取模处理。因此,先计算链表长度,同是令p指向链表最后节点。接下来k对l取模,再令q从头节点往后移动l-k步,这样q就指向要旋转的位置。最后将q后面的节点放到前面即可。
[code]假设k=2,加头之后链表为: h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL。 领p指向链表最后节点,q指向要旋转的位置,即: h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL ^ ^ | | q p 接下来把q后面的节点放到前面: h -> 0 -> 4 -> 5 -> 1 -> 2 -> 3 -> NULL ^ ^ | | p q
处理的时候,同样先对链表加头,方便处理,类似于Remove
Nth Node From End of List、Swap Nodes in Pairs、Reverse
Nodes in k-Group,同样先对链表加头处理。
时间复杂度:O(l)(l是链表长度)
空间复杂度:O(1)
[code] 1 class Solution 2 { 3 public: 4 ListNode *rotateRight(ListNode *head, int k) 5 { 6 if(head == NULL) 7 return NULL; 8 9 // 链表加头,方便处理 10 ListNode *h = new ListNode(0), *p, *q; 11 h -> next = head; 12 13 int l = 0; 14 // p指向最后节点 15 for(p = h; p -> next != NULL; ++ l, p = p -> next); 16 // q指向要要旋转位置,即旋转后最后节点 17 for(q = h, k = l - k % l; k > 0; -- k, q = q -> next); 18 19 // 把链表后半段放到前面 20 p -> next = h -> next; 21 h ->next = q -> next; 22 q -> next = NULL; 23 24 return h -> next; 25 } 26 };
转载请说明出处:LeetCode --- 61. Rotate List
相关文章推荐
- [LeetCode]61. Rotate List
- 【LeetCode】61. Rotate List
- LeetCode - 61. Rotate List
- leetcode61~Rotate List
- LeetCode 61. Rotate List
- [leetcode] 61.Rotate List
- [leetcode 61] Rotate List
- LeetCode_61---Rotate List
- leetcode 61Rotate List
- [leetcode] 61. Rotate List
- Leetcode 61. Rotate List (Medium) (cpp)
- leetcode-61. Rotate List
- LeetCode 61. Rotate List
- LeetCode61Rotate List
- LeetCode-61-Rotate List 链表水题
- 【leetcode】【61】Rotate List
- 链表系列-把链表向右旋转k个位置LeetCode#61. Rotate List
- Leetcode 61. Rotate List (旋转链表)
- 【Leetcode】61. Rotate List - 循环链表
- leetcode解题61. Rotate List java版(旋转链表)