题目

标题和出处

标题:旋转链表

出处:61. 旋转链表

难度

4 级

题目描述

要求

给你一个链表的头结点 链表题目:旋转链表 - 图1,旋转链表,将链表每个结点向右移动 链表题目:旋转链表 - 图2 个位置。

示例

示例 1:

链表题目:旋转链表 - 图3

输入:链表题目:旋转链表 - 图4
输出:链表题目:旋转链表 - 图5

示例 2:

链表题目:旋转链表 - 图6

输入:链表题目:旋转链表 - 图7
输出:链表题目:旋转链表 - 图8

数据范围

  • 链表中结点的数目在范围 链表题目:旋转链表 - 图9
  • 链表题目:旋转链表 - 图10
  • 链表题目:旋转链表 - 图11

解法

思路和算法

如果链表为空,则直接返回空链表即可。只有当链表不为空时,才需要考虑旋转后的列表。

假设链表的长度为 链表题目:旋转链表 - 图12,即链表包含 链表题目:旋转链表 - 图13 个结点,则将链表向右旋转 链表题目:旋转链表 - 图14 个位置之后回到原始链表。因此,将链表向右旋转 链表题目:旋转链表 - 图15 个位置等价于将链表向右旋转 链表题目:旋转链表 - 图16 个位置。令 链表题目:旋转链表 - 图17,使得 链表题目:旋转链表 - 图18,再考虑链表向右旋转 链表题目:旋转链表 - 图19 个位置之后的结果。以下只考虑 链表题目:旋转链表 - 图20 的情况。

链表题目:旋转链表 - 图21 时,旋转后的链表为原始链表,因此直接返回 链表题目:旋转链表 - 图22

链表题目:旋转链表 - 图23 时,需要考虑旋转后的链表的头结点和尾结点。由于新的头尾结点一定和原始的头尾结点不同,因此首先将原始链表的尾结点和头结点相接,使得链表变成环,然后定位到新的头尾结点并将连接断开,返回新的头结点作为旋转后的链表。

将原始链表向右旋转 链表题目:旋转链表 - 图24 个位置之后,原始链表的倒数第 链表题目:旋转链表 - 图25 个结点变成新的头结点,等价于原始链表的正数第 链表题目:旋转链表 - 图26 个结点,新的尾结点是原始链表的正数第 链表题目:旋转链表 - 图27 个结点。因此,从原始链表的头结点开始向后移动 链表题目:旋转链表 - 图28 步即可得到新的尾结点,新的尾结点的后面一个结点即为新的头结点。

链表题目:旋转链表 - 图29 表示原始链表的尾结点,用 链表题目:旋转链表 - 图30链表题目:旋转链表 - 图31 表示旋转后的新的头结点和尾结点。遍历链表到最后一个结点即可定位 链表题目:旋转链表 - 图32,将链表变成环只需要令 链表题目:旋转链表 - 图33 即可。从 链表题目:旋转链表 - 图34 出发,向后移动 链表题目:旋转链表 - 图35 次即可定位到 链表题目:旋转链表 - 图36链表题目:旋转链表 - 图37 即为 链表题目:旋转链表 - 图38,令 链表题目:旋转链表 - 图39 即可断开新的头尾结点之间的连接。最后返回 链表题目:旋转链表 - 图40 即可。

代码

  1. class Solution {
  2. public ListNode rotateRight(ListNode head, int k) {
  3. if (head == null) {
  4. return head;
  5. }
  6. int n = 1;
  7. ListNode tail = head;
  8. while (tail.next != null) {
  9. tail = tail.next;
  10. n++;
  11. }
  12. k %= n;
  13. if (k == 0) {
  14. return head;
  15. }
  16. tail.next = head;
  17. int newTailIndex = n - k;
  18. ListNode newTail = head;
  19. for (int i = 1; i < newTailIndex; i++) {
  20. newTail = newTail.next;
  21. }
  22. ListNode newHead = newTail.next;
  23. newTail.next = null;
  24. return newHead;
  25. }
  26. }

复杂度分析

  • 时间复杂度:链表题目:旋转链表 - 图41#card=math&code=O%28n%29&id=uypTC),其中 链表题目:旋转链表 - 图42 是链表的长度。需要遍历链表一次,计算链表长度和定位到尾结点,然后再次遍历链表定位到新的头尾结点,将链表连接成环和在新的头尾结点处断开连接的操作都是 链表题目:旋转链表 - 图43#card=math&code=O%281%29&id=pOgUC) 的时间。
  • 空间复杂度:链表题目:旋转链表 - 图44#card=math&code=O%281%29&id=T7HIT)。