一、旋转链表
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
Leetcode:https://leetcode.cn/problems/rotate-list/description/
二、分析
链表问题比较简单,来一个 node 指针,和一个 len 来记录链表长度,遍历一次链表求出长度。然后让 node 的 next 指向 head,将链表变成一个环形的。
根据 K,计算出还要走 len-k 步,可以到达结果链表头节点的前一个位置。注意 len-k,应该为 len-k%len
,因为 K 有可能大于 len。最后返回 node 下一个节点即可
1 2 3 4 5 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
| struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} explicit 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 == nullptr || head->next == nullptr || k == 0) { return head; } ListNode* node = head; int len = 1; while (node->next != nullptr) { len++; node = node->next; } int add = len - k%len; if (add == len) { return head; } node->next = head; while (add--) { node = node->next; } ListNode* res = node->next; node->next = nullptr; return res; } };
|