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; } };

浙公网安备 33010602011771号