题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
//链表翻转
void reverseList(ListNode* node, int k)
{
ListNode *pre = node;
ListNode *cur = node->next;
ListNode *temp = cur->next;
for (int i = 1; i < k; i++) {
ListNode* temp = cur->next;
cur->next = temp->next;
temp->next = pre->next;
pre->next = temp;
}
}
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
// 将两个指针进行偏移然后翻转
if(!head) return head;
ListNode* vhead = new ListNode(-1);
vhead->next = head;
ListNode *pre = vhead;
ListNode* p = head;
//计算列表长度
int n = 0;
while(p) {
p = p->next;
n++;
}
//翻转区间个数
int i = n/k;
if(i == 0) return vhead->next;
//先翻转k个点,之后再进行将点往后移k个点,继续进行翻转k个点。
while(i--) {
reverseList(pre, k);
for(int z = 0; z < k; z++) pre = pre->next;
}
return vhead->next;
}
};