题目描述:https://leetcode-cn.com/problems/rotate-list/
思路:
- 我的解法:
快慢指针,distance(snow, fast) = len(list) - k,head为头节点,prev为snow的上一个节点。当fast == tail时执行:
prev->next = tail->next;
tail->next = head;
评价:链表长度len(list)未知,无法定义快慢指针。快慢指针的适用场景,确实值得思考。
- 闭合为环
记给定链表的长度为 nn,注意到当向右移动的次数 k \geq nk≥n 时,我们仅需要向右移动 k \bmod nkmodn 次即可。因为每 nn 次移动都会让链表变为原状。这样我们可以知道,新链表的最后一个节点为原链表的第 (n - 1) - (k \bmod n)(n−1)−(kmodn) 个节点(从 00 开始计数)。
这样,我们可以先将给定的链表连接成环,然后将指定位置断开。
具体代码中,我们首先计算出链表的长度 nn,并找到该链表的末尾节点,将其与头节点相连。这样就得到了闭合为环的链表。然后我们找到新链表的最后一个节点(即原链表的第 (n - 1) - (k \bmod n)(n−1)−(kmodn) 个节点),将当前闭合为环的链表断开,即可得到我们所需要的结果。
特别地,当链表长度不大于 11,或者 kk 为 nn 的倍数时,新链表将与原链表相同,我们无需进行任何处理。
https://leetcode-cn.com/problems/rotate-list/solution/xuan-zhuan-lian-biao-by-leetcode-solutio-woq1/
思辨:当链表长度未知时,如何设计算法?一定要知道链表长度吗?