61. 旋转链表

61. 旋转链表

难度中等772收藏分享切换为英文接收动态反馈

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

img

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

img

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500]
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 109

思路:

​ 将链表接成环,在要求位置断开即可,给出官方题解。

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        //去除特殊情况
        if (k == 0 || head == nullptr || head->next == nullptr) {
            return head;
        }
        int n = 1;//计算链表长度
        ListNode* iter = head;
        while (iter->next != nullptr) {
            iter = iter->next;
            n++;
        }
        //环切开的位置
        int add = n - k % n;
        if (add == n) {
            return head;
        }
        iter->next = head;
        while (add--) {
            iter = iter->next;
        }
        ListNode* ret = iter->next;
        iter->next = nullptr;
        return ret;
    }
};
posted @ 2022-05-21 10:15  BailanZ  阅读(20)  评论(0编辑  收藏  举报