旋转链表 题目思路代码 题目 思路 先求出整个链表的长度,然后将传入的需要链表右移的次数k对长度取余数,得出最少需要我们移动的次数。我们通过快慢指针来找倒数第k个数的前一个数,一开始他们都指向头节点,然后先让fast走k步,之后fast和slow一起走,当fast走到最后一个结点的时候slow走到了倒数第k+1个结点。然后找到链表中倒数第 k 个数的前一个数slow,slow的next为新链表的头结点,最后将slow的next指向nullptr,并将原链表首尾相连。 代码 /** * 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 || !head->next) return head; auto p{head}, dummy{new ListNode(-1)}; dummy->next = head; auto slow{dummy}, fast{slow}; auto length{1}; while (p->next) { ++length; p = p->next; } k %= length; for (int i = 0; i < k; ++i) fast = fast->next; while (fast->next){ slow = slow->next; fast = fast->next; } p->next = head; auto res{slow->next}; slow->next = nullptr; return res; } };