25. Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
- Only constant extra memory is allowed.
- You may not alter the values in the list's nodes, only nodes itself may be changed
传送门:25. Reverse Nodes in k-Group
放战术解答:
遍历一次链表的值,用vector容器存储起来,然后调用reverse函数逐个反转,最后转回链表。
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
vector<int> array;
while(head != NULL) {
array.push_back(head->val);
head = head->next;
}
for(int i =0; i<array.size()/k; ++i)
reverse(array.begin()+i*k, array.begin()+(i+1)*k);
ListNode *dummy = new ListNode(0), *currNode=dummy;
for(auto a:array) {
currNode->next = new ListNode(a);
currNode = currNode->next;
}
return dummy->next;
}
};
走流程解答:
借助链表反转的操作,将原先指向NULL的prev指针改为指向下一组需要反转节点的头节点,因为下一组还未反转所以需要使用递归,最后需要特别注意对最后一组节点的处理。
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *curr = head, *prev, *next;
int i;
for(i=0; i<k && head!=NULL; ++i)
head = head->next;
if(head == NULL)
if(i == k) prev = NULL;
else return curr;
else
prev = reverseKGroup(head, k);
for(int i=0; i<k; ++i) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};