题目:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6
分析:
这个题是链表逆置的升级版。重点是,把整个链表按照每K个一组分成若干组。递归翻转,先翻转最后一组,依次向前翻转。
不好理解的地方在于,每一组翻转后怎么衔接。其实跳出递归后,表示后面的节点已经完成了翻转,只需要把这一组原来的头结点的next指向后面的节点就完成了组之间的衔接。可以把后面的节点想象成一个节点。
例:1->2->3->4 ,k=2
Node* reverseKGroup(Node* head, int k) {
Node* next_head = head;
int count = 0;
/*next_head 把第一组跳过,指向下一组的head*/
while (next_head != NULL && count != k) {
next_head = next_head->_pNext;
count++;
}
//如果剩余节点个数不足k个,则不翻转
if (count == k) {
/*递归让后面的组先翻转*/
next_head = reverseKGroup(next_head, k);
/*循环count次,翻转链表中的一组*/
while (count-- > 0) {
Node* next = head->_pNext;/*保存修改之前的pNext*/
/*!!在这个循环中next_head复用,第一次循环用于链接两个组
之后可以当做pPre,即修改链表之前的上一个节点!!*/
head->_pNext = next_head;
next_head = head;
head = next;
}
/*循环后,head会跟着next跑到这一组之外,此时next_head正好指向新头*/
head = next_head;
}
return head;
}