LeetCode 61. 旋转链表
题目链接
一共用两个指针,第一个记录链表的尾节点,第一次遍历记录链表的长度,由于k可能很大所有我们对k模上n,第二次遍历记录我们用第二个指针记录要翻转的第二段链表的前一个节点,然后用尾部指针tail的next指针指向头结点,头结点等于第二个指针的next指针,第二个指针的next指针指向NULL。
/**
* 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) {
if(!head || !head->next) return head;
int n = 0;
ListNode* tail;
for(auto p = head; p; p = p->next){
tail = p;
n++;
}
k %= n;
if(!k) return head;
auto p = head;
for(int i = 0; i < n - k - 1; i++) p = p->next;
tail->next = head;
head = p->next;
p->next = NULL;
return head;
}
};