LeetCode Reverse Nodes in k-Group

126 篇文章 0 订阅

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

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值