链表翻转,每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。
解题思路:
寻找每一段的开始与结束,对每一段进行翻转。代码如下(代码不含测试用例以及链表的构建):
void _ReserveK(Node** begin, Node** end)
{
Node* listBegin = *begin;
Node* listEnd = *end;
if(listBegin->_next == NULL || *end == NULL || listBegin->_next == listEnd)
return;
Node* reserveEnd = listBegin->_next;
while(listBegin->_next != listEnd)
{
Node* tmp = listBegin->_next;
listBegin->_next = reserveEnd->_next;
reserveEnd->_next = reserveEnd->_next->_next;
listBegin->_next->_next = tmp;
}
}
void ReserveK (Node** head, size_t K)
{
//注意:传进来的节点为头节点,如果不是
//头结点,可以自行创建一个头结点使其指向
//链表的首节点。
Node* listHead = *head;
if(listHead == NULL || listHead->_next == NULL || K <= 1)
return;
Node* cur = listHead;
Node* begin = NULL; //翻转的开始
Node* end = NULL; //翻转的结束
size_t k = K;
while(cur != NULL)
{
k = K;
begin = cur;
//begin->_next为翻转后的末尾值
Node* reserveEnd = begin->_next;
while(cur != NULL && k > 0)
{
cur = cur->_next;
--k;
}
end = cur;
_ReserveK(&begin, &end);
if(cur != NULL)
cur = reserveEnd;
}
}
下面对_ReserveK函数内while循环进行图解。