思想:
翻转的意思就是留下最右面的K个节点,剩下的都翻到后面去。
将首、尾节点相连;
求出要翻转的节点个数k;
尾节点向后移动k个节点;
断开节点;
注意的是k可能大于链表长度len,若这样,取摸后的值就是从后往前要留下的节点的个数,其余的翻转到右面去。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head == NULL || k == 0) return head;
int len = 1;
ListNode *p = head;
while(p->next) { // get the length of the list
len++;
p = p->next;
}
k = len - k%len;
// link the end to the head
p->next = head;
// run k steps
for(int step=0;step<k;step++) {
p=p->next;
}
// cut
head = p->next;
p->next = NULL;
return head;
}
};