您的位置:首页 > Web前端 > Node.js

LeetCode Reverse Nodes in k-Group

2013-12-11 21:04 225 查看
这题好像是美团的一道笔试题,当初记得一种好的方法使用栈,但是这要复制元素,本题有了限制;之后我花了两个小时想找递归的算法,后来还是没找到,下面的是最普通的那种做法,也是调了一阵子才弄出来的。

void reverse(ListNode **s,ListNode**e)
{
ListNode *p=*s,*q=NULL,*r=NULL;
(*e)->next = NULL;//this is very important
if (*s==*e)
return ;
if(p)
q = p->next;
if (q&&q!=*e)
r = q->next;
q->next = p;
p =q;
q = r;
while(q)
{
if(r)//&&r!=*e
{
r =r->next;
//q = r;
}
//else
//	q = NULL;
q->next = p;
p = q;
q = r;

}
(*s)->next = NULL;
}
ListNode *reverseKGroup(ListNode *head, int k) {
if(head==NULL||head->next==NULL||k<=1)
return head;
ListNode *s1=head,*e1=NULL;
ListNode *rethead=NULL,*p=NULL,*q=head;
while(q)
{
s1 = q;
int i;
for (i=0;i<k&&q;i++)
{
e1 = q;
q = q->next;
}
if (i!=k&&q==NULL&&rethead==NULL)
{
return head;
}
if (q==NULL&&i<k)//add this means when remaining nodes less than k do not converse
{
p->next = s1;
p = e1;
break;//return rethead;
}
reverse(&s1,&e1);
if (rethead==NULL)
{
rethead = e1;
p = s1;
}
else
{
p->next = e1;
p = s1;
}
}
if(p)
p->next = NULL;
return rethead;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: