题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
struct ListNode* createnode(int val)//一个创建新的链表节点的函数
{
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
if(newnode!=NULL)
{
newnode->val = val;
newnode->next = NULL;
return newnode;
}
return NULL;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
// write code here
struct ListNode* newhead = createnode(-1);//首先创建一个没用的节点作为头节点
struct ListNode* output = newhead;//对于该节点进行备份,因为后面需要进行->next操作
while(1)
{
int loop_break = 0;
if(head==NULL)//对应的是空链表以及剩余节点数量不足以反转导致的指针为NULL的情况(就是这种例子{1,2,3,4,5},7)
{
break;
}
struct ListNode* head_cp = head;//head作为头指针,head_cp作为尾指针,将包括在内的节点反转
int enough = 1;
for(int i=0;i<k-1;i++)//这个循环是围为了判断是否存在足够的节点被反转
{
if(head_cp!=NULL)
{
head_cp = head_cp->next;
if(head_cp==NULL)//说明不够了
{
enough=0;
break;
}
}
else
{
return NULL;
}
}
int str[k];//存储要被反转的节点的val
for(int i=0;i<k;i++)//初始化,因为不反转的部分也要存在里面,如果数量不够,后面读取会导致段错误
{
str[i] = -1;
}
if(enough==1)//数量够反转
{
for(int i=k-1;i>=0;i--)//将节点的值倒序存在数组中
{
if(head!=NULL)
{
str[i] = head->val;
}
else
{
printf("...error\n");
return 0;
}
head=head->next;
}
}
else
{
for(int i=0;i<k;i++)//将节点的值正序存储在数组中
{
if(head!=NULL)
{
str[i] = head->val;
}
else
{
break;
}
head=head->next;
}
loop_break = 1;//当进入else说明不够反转数量,即结束的意思
}
for(int i=0;i<k;i++)
{
if(str[i]>=0)//这就是为什么初始化为-1的原因
{
printf("%d ",str[i]);
struct ListNode* newnode = createnode(str[i]);
if(newnode!=NULL)
{
newhead->next = newnode;
newhead = newhead->next;
}
}
}
if(loop_break==1)//
{
break;
}
}
output = output->next;
return output;
}


