/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
//当链表为空,返回空指针
if(head == NULL)
return NULL;
//当链表只有一个元素,直接返回
if(head -> next == NULL)
return head;
//声明参数
int i, j;
int num = 0;
struct ListNode *t, *pr, *ne, *p, *q, *r, *s;
t = head;
pr = head;
ne = head;
p = NULL;
q = NULL;
r = NULL;
s = NULL;
//获取链表元素数目
while(t != NULL)
{
++num;
t = t -> next;
}
//当k大于链表元素总数,不做处理,直接返回
if(num < k)
return head;
//用t指向最终返回的链表头
t = head;
for(i = 1; i < k; ++i)
t = t -> next;
//进行num/k次循环转序处理
for(j = 0; j < num / k; ++j)
{
//初始将s、p、q三个指针指向当前处理子链表的第一个节点
s = pr; //用于记录当前子链表转序处理完成后的最后一个节点
q = pr; //用做游标指针,标记当前处理节点
p = pr; //用作tmp指针,辅助完成节点排序
//初始将pr、ne两个指针指向当前处理子链表的最后一个节点
//用pr指针记录转序结束得到的新串的第一个节点
for(i = 1; i < k; ++i)
{
if(pr -> next != NULL)
{
pr = pr -> next;
ne = ne -> next;
}
}
//用ne指针记录当前处理子链表的下一个元素或空指针
ne = ne -> next;
//转序处理(按顺序将子链表内第1到k-1个元素插入最后一个元素的后面)
while(q != pr)
{
q = q-> next;
p -> next = pr -> next;
pr -> next = p;
p = q;
}
//对转序结束得到的新串设置后继
s -> next = ne;
//对转序结束得到的新串设置前继
if(r != NULL)
r -> next = pr;
//初始化下一次循环的初始条件(上一个子链表的尾节点、预处理子链表的首节点)
r = s;
pr = ne;
}
return t;
}
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
//当链表为空,返回空指针
if(head == NULL)
return NULL;
//当链表只有一个元素,直接返回
if(head -> next == NULL)
return head;
//声明参数
int i, j;
int num = 0;
struct ListNode *t, *pr, *ne, *p, *q, *r, *s;
t = head;
pr = head;
ne = head;
p = NULL;
q = NULL;
r = NULL;
s = NULL;
//获取链表元素数目
while(t != NULL)
{
++num;
t = t -> next;
}
//当k大于链表元素总数,不做处理,直接返回
if(num < k)
return head;
//用t指向最终返回的链表头
t = head;
for(i = 1; i < k; ++i)
t = t -> next;
//进行num/k次循环转序处理
for(j = 0; j < num / k; ++j)
{
//初始将s、p、q三个指针指向当前处理子链表的第一个节点
s = pr; //用于记录当前子链表转序处理完成后的最后一个节点
q = pr; //用做游标指针,标记当前处理节点
p = pr; //用作tmp指针,辅助完成节点排序
//初始将pr、ne两个指针指向当前处理子链表的最后一个节点
//用pr指针记录转序结束得到的新串的第一个节点
for(i = 1; i < k; ++i)
{
if(pr -> next != NULL)
{
pr = pr -> next;
ne = ne -> next;
}
}
//用ne指针记录当前处理子链表的下一个元素或空指针
ne = ne -> next;
//转序处理(按顺序将子链表内第1到k-1个元素插入最后一个元素的后面)
while(q != pr)
{
q = q-> next;
p -> next = pr -> next;
pr -> next = p;
p = q;
}
//对转序结束得到的新串设置后继
s -> next = ne;
//对转序结束得到的新串设置前继
if(r != NULL)
r -> next = pr;
//初始化下一次循环的初始条件(上一个子链表的尾节点、预处理子链表的首节点)
r = s;
pr = ne;
}
return t;
}