1. 题目描述
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
.
2.解决方案1
class Solution { public: ListNode *rotateRight(ListNode *head, int k) { if(head == NULL || k <= 0) return head; //get length ListNode *temp = head; int node_count = 0; while(temp != NULL) { node_count++; temp = temp->next; } if(k > node_count) k = k%node_count; if(k == node_count || k == 0) return head; //first node move k step ListNode *first = head; while( k > 0) { first = first->next; k--; } //when first node move to last, the second node move (length - k) step ListNode *second = head; while(first->next != NULL) { first = first->next; second = second->next; } ListNode *newhead = second->next; //be a circle first->next = head; //broken circle second->next = NULL; return newhead; } };
思路:使用了快慢指针的技巧。但由于k的值有可能大于整个的长度,所以还要先求出list的长度。先用快的指针走k步,然后再把它走到尾部,这个时候慢指针就走了length – k 的步数。再头尾相连组成环,再断环,返回新的头部指针。
3.解决方案2
class Solution { public: ListNode* getLastNode(ListNode *head, int& len){ ListNode* node = head; len = 1; if(head == NULL){ len = 0; return NULL; } while( node->next != NULL){ node = node->next; len++; } return node; } ListNode *rotateRight(ListNode *head, int k) { if(head == NULL){ return head; } int len; ListNode* lastNode = getLastNode(head, len); lastNode->next = head; k %= len; int step = len - k; while(step>0){ lastNode = lastNode->next; step--; } head = lastNode->next; lastNode->next = NULL; return head; } };
思路:先直接一个一个走到最后一个指针,然后连接成环,然后再行走lenght – k 的步数。再断环。
1579