在这个题目上耗费了一天多的时间,下决心搞明白。
题目的难点主要在于不同子链反转之后的拼接问题,这个问题处理起来细节比较多,看别人的代码很难明白,因此需要自己多画图。
分析时令count=9,K=4,即总结点数为9个,反转子链的长度为4,也就是需要有2个子链需要反转,每轮反转动作为3个,即(K-1)。
/*
首先定义变量:
pre_last:前子链的最后一个结点
first:本子链第一个结点,即反转后的最后一个结点
pre:待反转结点的前一个结点
cuur:待反转结点
rear:待反转结点后一个结点,用于保存后续结点的地址
*/
void K_Reverse(List L, int K)
{
int i, count = 0;
List tmp, pre_last,first, pre, curr,rear;
tmp = L->Next;
while (tmp) { //记录结点数量
count++;
tmp = tmp->Next;
}
pre_last = L; //首次进入反转前的处理
for (i = 1; i <= count / K; i++) //i为轮次,即需要反转的子链个数
{
pre = pre_last->Next; //处理子链表前的初始化
curr = pre->Next;
first = pre;
int j = K - 1;
while (j--)
{
rear = curr->Next; //记录待反转结点后的结点地址
curr->Next = pre; //反转
pre = curr; curr = rear; //后移
}
pre_last->Next = pre; //每轮结束后的处理
first->Next = curr;
pre_last = first;
}
}
整个过程流程图如下: