一、问题描述
Description: Given a linked list, reverse the nodes of a linked list
k at a time and return its modified list.If the number of nodes is not a multiple of
k then left-out nodes in the end should remain as it is.
For 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: You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
给一个链表,每
若最后剩下的不足
注意:
- 只能操作结点,不能操作值域。
- 只能使用常量的空间。
二、解题报告
本题是《LeetCode 24 - Swap Nodes in Pairs》的扩展,每
直接上代码:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(head == NULL)
return NULL;
if(k==1) return head;
ListNode* start = head;
ListNode* end = head;
ListNode* p = new ListNode(0); // 头指针
ListNode* new_head = p;
while(true) {
int i;
for(i=0; i<k; ++i) { // 向前移动k步
if(end!=NULL)
end = end->next;
else
break;
}
if(i <= k-1) // 不足k个,退出循环
break;
ListNode* q = start; // 暂存start结点
while(start!=end) { // 采用"头插法"进行逆转
ListNode* temp = start;
start = start->next;
temp->next = p->next;
p->next = temp;
}
p = q; // 逆转后第一个结点在末尾,p指向末尾
start = end;
}
p->next = start;
return new_head->next;
}
};
LeetCode答案源代码:https://github.com/SongLee24/LeetCode