题解 | #牛群旋转#
牛群旋转
https://www.nowcoder.com/practice/5137e606573843e5bf4d8ea0d8ade7f4
// 解题思路:1,先计算链表的长度,根据该长度判断k是否超过该长度 // 2,在获得更新的k后,寻找链表的转折点 // 3,在该转折点处打断原来链表,把前面部分的链表衔接到后面部分的尾部 // 4,返回转折点后面部分的链表
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ ListNode* rotateLeft(ListNode* head, int k) { // 解题思路:1,先计算链表的长度,根据该长度判断k是否超过该长度 // 2,在获得更新的k后,寻找链表的转折点 // 3,在该转折点处打断原来链表,把前面部分的链表衔接到后面部分的尾部 // 4,返回转折点后面部分的链表 if(head == nullptr){ return head; } int counter = 0; ListNode* act = head; while(act){ // 先计算链表的长度 act = act->next; counter++; } if(k > counter){ // 检查所给的k是否超过链表的长度 k = k - counter; } ListNode* fast = head; ListNode* slow = head; ListNode* pre = head; while(k){ // 通过快指针先走的方法来获取转折点 fast = fast->next; k--; } while(fast){ // 快指针走完后,慢指针所到的位置就是转折点 pre = slow; // 并记录转折点的前一个,用于断开原链表 slow = slow->next; fast = fast->next; } ListNode* mark = slow; // 标记的转折点后的链表为新的链表头 pre->next = nullptr; ListNode* mact = mark; while(mact->next){ // 找链表头的尾部 mact = mact->next; } mact->next = head; // 把断开的旧链表头衔接到新链表头的尾部 return mark; } };