Given a linked list, rotate the list to the right by k places, where k is non-negative.
Example 1:
Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL
我最开始的思路; 双指针,一个指向末尾,一个指向新的头部前的一个指针
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL || k==0) return head;
ListNode* slow = new ListNode(-1);
ListNode* fast = new ListNode(-1);
ListNode dummy(0);
dummy.next = head;
slow->next = head;
fast->next = head;
int length = 0;
while(head){
head = head->next;
length++;
}
int rightNumber = k%length;
for(int i=0;i<rightNumber;i++){
fast = fast->next;
}
while(fast->next){
slow = slow->next;
fast = fast->next;
}
fast->next = dummy.next;
dummy.next = slow->next;
slow->next = NULL;
return dummy.next;
}
};
更好的思路,这种题目可以让整个单链表变成一个环,然后断开环成为一个新的单链表
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if (head == nullptr || k == 0) return head;
int len = 1;
ListNode* p = head;
while (p->next) { // ???
len++;
p = p->next;
}
k = len - k % len;
p->next = head; // ????
for(int step = 0; step < k; step++) {
p = p->next; //?????
}
head = p->next; // ?????
p->next = nullptr; // ???
return head;
}
};