题解 | #链表中的节点每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; }