Rotate List

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个节点轮转到链表前面。

对于这题我们首先需要遍历链表,得到链表长度n,因为k可能大于n,所以我们需要取余处理,然后将链表串起来形成一个换,在遍历n - k % n个节点,断开,就成了。譬如上面这个例子,k等于2,我们遍历到链表结尾之后,连接1,然后遍历 5 - 2 % 5个字节,断开环,下一个节点就是新的链表头了。

代码如下:

  1. class Solution {
  2. public:
  3. ListNode *rotateRight(ListNode *head, int k) {
  4. if(!head || k == 0) {
  5. return head;
  6. }
  7. int n = 1;
  8. ListNode* p = head;
  9. //得到链表长度
  10. while(p->next) {
  11. p = p->next;
  12. n++;
  13. }
  14. k = n - k % n;
  15. //连接成环
  16. p->next = head;
  17. for(int i = 0; i < k; i++) {
  18. p = p->next;
  19. }
  20. //得到新的链表头并断开环
  21. head = p->next;
  22. p->next = NULL;
  23. return head;
  24. }
  25. };