题目
描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000 , 11≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度 O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k=2 , 你应该返回 2→1→4→3→5
对于 k=3 , 你应该返回 3→2→1→4→5
代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
typedef struct ListNode* pnode;
static struct ListNode* ReverseList(struct ListNode* pHead ) {
// write code here
pnode p = NULL ;
pnode q = pHead;
while(q)
{
pnode m = q->next;
q->next = p ;
p = q ;
q = m ;
}
return p;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
// write code here
if(k<=1)return head;
struct ListNode tmphead = {.val = -1 , .next = head};
pnode pthead = &tmphead;
pnode p_pre = pthead;
pnode p = pthead->next;
pnode q = pthead->next;
pnode q_next = NULL;
bool loop = true;
while(loop)
{
for(int i = 1 ; i<k ; i++)
{
if(q)
{
q=q->next;
q_next = q;
}else{
loop = false;
}
}
if(loop)
{
if(q){
q_next = q->next;
q->next = NULL;
}else{
loop=false; // 在上述中q=NULL也会被算作一个有效元素 所以要去掉
continue;
}
p_pre->next = ReverseList(p);
p->next = q_next;
p_pre = p;
p = q = q_next;
}
}
return pthead->next;
}