原文链接: LeetCode 61. 旋转链表——每日一题
更多题解:ACfun 的 Blog
题解
解题思路
直接将链表的每一个节点存到一个数组当中,存的时候将每一个节点的位置向后偏移 k 位存储。为了实现循环存储需要先求出链表的长度,然后通过取余的方式来求得当前节点应当存储的位置。存储完成之后,先生成一个 哑结点,然后将数组中的所有节点串起来,最后要注意使新链表的最后一个节点指向 nullptr
。
解题代码
/**
* 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) {
vector<ListNode*> v(510);
auto p = head;
int len = 0;
while (p) {
len++;
p = p -> next;
}
p = head;
int x = 0;
while (p) {
v[(x + k) % len] = p;
p = p -> next;
x++;
}
auto dummy = new ListNode(-1), q = dummy;
for (int i = 0; i < len; i++) {
q -> next = v[i];
q = q -> next;
}
q -> next = nullptr;
return dummy -> next;
}
};
未完待续,持续更新中……