考点
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: ListNode* rotateRight(ListNode* head, int k) { ListNode *dummyHead = new ListNode(-1, head), *slow = dummyHead, *fast = dummyHead, *tmp = head; int len = 0; while (tmp != nullptr) { tmp = tmp->next; len++; } if (len && (k %= len)) { while (k--) fast = fast->next; while (fast->next != nullptr) { slow = slow->next; fast = fast->next; } ListNode *subHead = slow->next; slow->next = fast->next; fast->next = dummyHead->next; dummyHead->next = subHead; } return dummyHead->next; } };
|
思路
根据题意,假设链表{1, 2, 3, 4, 5}右移3个单位,很容易想到
故而先求整个链表的长度,然后让K对它取余,就能得到需要移动的子链表长度
假设整个链表长度为5,子链表长度也为5,那么子链表就是整体链表,就不需要移动
然后使用快慢指针找到子链表的dummyHead、头节点和尾节点后,更改位置即可
当然,你也可以把链表连接成环,同样使用快慢指针找到子链表的dummyHead与头节点并断开形成新链表,时间复杂度是一样的,你可以尝试一下~