题解 | #链表中的节点每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类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
//首先定义一个虚拟头节点
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
//这里相当于使用双指针,一个在前面,一个在后面,来实现两个数的交换
ListNode* pre = dummyHead;
ListNode* cur = head;
int size = 0;
//获取链表总的节点数,主要用于判断是否在反转区间
while(cur){
size++;
cur = cur->next;
}
cur = head;
//小于等于K时需要反转,大于则不再需要
for(int i = k; i <= size; i += k){
int curlen = k;
//交换一个k区间的节点
while(--curlen){
ListNode* temp = cur->next;
cur->next = temp->next;
temp->next = pre->next;
pre->next = temp;
}
//更新下一次反转的头节点,因为在上面的反转方法中,一次k区间反转,pre的位置是不变的
//始终处于头节点,所以在进行写一次k区间反转时,要更新pre的位置。
pre = cur;
cur = cur->next;
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};