Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL
and k = 2
,
return 4->5->1->2->3->NULL
.
将链表从右边数第k个开始后面的全部交换到链表的左侧。例如对于1,2,3,4,5,6 和 k = 2,就有交换之后的节点就是5,6,1,2,3,4。注意这里的k可能会超过链表的长度大小。
做法是首先可以计算链表的长度len,再将链表连成一个环状。接着从链表起始数len - k将链表断开,那么就完成了旋转,代码如下:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* rotateRight(ListNode* head, int k) { 12 if(!head) return NULL; 13 ListNode * p1 = head; 14 int count = 0; 15 while(p1->next){ 16 count++; 17 p1 = p1->next; 18 } 19 count++; 20 int len = count - k%count;//注意给出的k可能会超过链表的总长度 21 if(len == 0) 22 return head; 23 p1->next = head; 24 p1 = head; 25 for(int i = 1; i < len; ++i){ 26 p1 = p1->next; 27 } 28 ListNode * ret = p1->next; 29 p1->next = NULL; 30 return ret; 31 } 32 };