
以下是 LeetCode 61. 旋转链表的 C 实现包含详细注释。思路是先计算链表长度连成环再根据旋转步数确定新的头节点并断开环。/** * 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) {} * }; */classSolution{public:ListNode*rotateRight(ListNode*head,intk){// 空链表、单节点或无需旋转的情况if(!head||!head-next||k0)returnhead;// 1. 计算链表长度并找到尾节点intn1;ListNode*tailhead;while(tail-next){tailtail-next;n;}// 2. 将链表首尾相连形成环tail-nexthead;// 3. 实际需要移动的步数取模避免重复旋转kk%n;// 4. 找到新的尾节点原头节点向前走 n - k - 1 步// 因为新头是原头向右移动 n-k 个位置即新尾是原头向左移动 k 个位置ListNode*newTailhead;for(inti1;in-k;i){newTailnewTail-next;}// 5. 断开环得到新链表ListNode*newHeadnewTail-next;newTail-nextnullptr;returnnewHead;}};复杂度分析· 时间复杂度O(n)其中 n 是链表长度。需要遍历链表两次一次求长度一次找新尾但总体仍是线性。· 空间复杂度O(1)只使用了常数个额外指针。关键点· 将链表连成环后旋转操作等价于在正确位置断开环。· 使用取模避免 k 大于链表长度时的无效遍历。· 注意处理边界情况空链表、单节点、k0。