本题有两种做法,方法都是找到关键点进行连接,两个关键点需要找到:
-
新头节点在原链表中的位置 - 1(前一个结点)
-
最后一个有效结点(node->next == NULL)
随后将这两个点进行连接。
解法1:计算总和记录最后一个结点,下次遍历记录新链表头结点的前一个结点。
class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if (!head || !head->next) return head; ListNode* p = head; int node_sum = 1; while (p->next) { node_sum++; p = p->next; } ListNode* tail = p; int x = k % node_sum; if (!x) return head; int i = 1; p = head; while (i<node_sum-x) { p = p->next; i++; } ListNode* newHead = p->next; tail->next = head; p->next = nullptr; return newHead; } };
解法2:使用快慢指针,让fast先抵达k+1结点,随后一起遍历,当fast抵达最后一个结点,slow此时便是要寻找的新链表头节点的前一个结点。
class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if (!head || !head->next) return head; ListNode* p = head; int node_sum = 0; while (p) { node_sum++; p = p->next; } int x = k % node_sum; if (!x) return head; ListNode* slow = head, *fast = head; while (x--) { fast = fast->next; } while (fast->next) { fast = fast->next; slow = slow->next; } ListNode* newHead = slow->next; fast->next = head; slow->next = nullptr; return newHead; } };
本节完