5.旋转链表

题目描述

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

原题链接

https://leetcode-cn.com/problems/rotate-list/description/

样例
head = [1,2,3,4,5], k = 2
[4,5,1,2,3]

head = [0,1,2], k = 4
[2,0,1]
想法

1.如果长度为0则直接返回头结点
2.先求链表的长度
3.找到链表的最后一个结点
4.将最后一个结点指向头结点,将头结点指向第sum-k个结点的next值,将第sum - k个结点的next指向null
5.注意:为了防止超时,将k=k%n.

时间复杂度

遍历两次链表,O(n)

空间复杂度

仅仅需要常数的额外空间

代码
/**
 * 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 || !k) {
            return head;
        }

        int sum = 1;
        ListNode* first = head;
        while (first->next) {
            // 找出链表的长度
            sum++;
            first = first->next;
        }
        // 找最后一个结点
        ListNode* last = first;
        // 将最后一个结点指向头结点,形成一个循环链表
        last->next = head;

        // 防止超时
        k %= sum;

        // 找到要返回的结点
        ListNode* re = last;
        int a = sum - k;
        while (a--) {
            re = re->next;
        }
        // 记录要返回的结点
        ListNode* renew = re->next;

        // 将最后一个结点置为空
        re->next = nullptr;
        return renew;
    }
};
posted @ 2021-12-15 10:32  jsqup  阅读(23)  评论(0编辑  收藏  举报