leetcode 旋转链表 中等

 

  

假设 k = 1,那么其实就是把最后一个节点放到了第一个变成头结点,然后倒数第二个称为尾节点。但由于不是双向链表,要知道前一个节点是谁,就只能存下来。

假设已知 head 为头节点,tail 为尾节点,pret 为倒数第二个节点,那么一次操作便是:tail -> next = head; pret -> next = nullptr, head = tail

然后很显然,k 需要对链表长度取模,因为重复一轮又一轮的移动没必要

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head == nullptr || head -> next == nullptr) return head;
        vector<ListNode*> pv;
        ListNode *tail = head;
        while(tail != nullptr) {
            pv.emplace_back(tail);
            tail = tail -> next;
        }

        int idx = pv.size() - 1;
        k %= pv.size();
        while(k > 0) {
            pv[idx] -> next = head;
            pv[idx - 1] -> next = nullptr;  // k %= pv.size(), 所以 idx - 1 不存在小于 0 的情况
            head = pv[idx];
            -- idx;
            -- k;
        }
        return head;
    }
};

 

posted @ 2021-07-28 23:03  rookie_Acmer  阅读(25)  评论(0)    收藏  举报