给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4 输出:[2,0,1]
思路很简单:先计算链表长度,再用双指针(易错点在代码注释里)
代码:
/*** 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) {ListNode * tmp = new ListNode(0,head);int count = 0;while(tmp!=nullptr){tmp = tmp->next;count++;}count = count -1; //注意长度计算if(count==0 || count==1){ //注意count = 0 和 count = 1 的特殊情况return head;}k = k%count;if(k==0){ //注意k=0的特殊情况return head;}ListNode * start = head;ListNode * end = head;for(int i = 0;i<k;i++){start = start ->next;} while(start->next!=nullptr){end = end->next;start = start->next;}ListNode * temp = end->next;end->next = nullptr;start->next = head;head = temp;return head;}
};