Rotate List
Solution 1
这个题原本以为很好解决,直到看到了偏移量会大于元素个数的情形。因为是链表,所以可以非常直接地将他连成一个环实现循环旋转。但是实际上不需要真的偏移 K K K次。首先遍历一次找到链表尾并记录长度,然后计算 n − K mod n n - K \operatorname{mod} n n−Kmodn,移动该偏移量后断开链表,并将head移动到断开后的后侧结点即位新的头部。
- 时间复杂度: O ( N ) O(N) O(N),移动的次数和输入长度呈线性关系, 同时需要遍历链表
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态变量
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (head == nullptr || k == 0) { return head; }
int length = 1;
auto tmp = head;
while (tmp->next != nullptr) {
tmp = tmp->next;
length++;
}
int offset = length - k % length;
tmp->next = head;
while(offset > 0) {
tmp = tmp->next;
offset--;
}
head = tmp->next;
tmp->next = nullptr;
return head;
}
};
Solution 2
Solution 1的Python实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if head is None or k == 0: return head
length = 1
tmp = head
while tmp.next != None:
tmp = tmp.next
length += 1
offset = length - k % length
tmp.next = head
while offset > 0:
tmp = tmp.next
offset -= 1
head = tmp.next
tmp.next = None
return head