旋转链表

一、旋转链表

给你一个链表的头节点 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;
}
};