problem:
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
.
thinking:
(1)链表的反转问题,双指针解决,一个前驱指针+前进指针
(2)注意K的大小
code:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: int calListLen(ListNode *node) //计算链表长度 { int len = 0; while(node) { len++; node = node->next; } return len; } ListNode *rotateRight(ListNode *head, int k) { if (head == NULL) return NULL; int len = calListLen(head); k = k % len; //K有可能大于链表长度 if (k == 0) return head; ListNode *p = head; ListNode *pPre = NULL; for(int i = 0; i < len - k; i++) { pPre = p; //前驱 p = p->next; //反转点第一个结点 } ListNode *q = p; while(q->next) //到达最后一个结点 q = q->next; if (pPre) pPre->next = NULL; q->next = head; return p; } };
原文地址:http://blog.csdn.net/hustyangju/article/details/44827805