Reverse Linked List II

<span style="font-size:14px;">这一道题,最好先做之前的  Reverse Linked ListI</span>
之后把他分成几个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 int LengthList(struct ListNode* head) 
{
	if(head==NULL)
		return 0;

	int length=0;
	struct ListNode* pCurrent=head;
	while(pCurrent!=NULL)
	{
		length++;
		pCurrent=pCurrent->next;
	}
	//free(pCurrent);
	return length;
}
 struct ListNode* reverseList(struct ListNode* head) {

	struct ListNode* newhead;
	newhead=NULL;
	//这样就不需要翻转了
	if (head==NULL||head->next==NULL)
	{
		return head;
	}
	struct ListNode* pCurrent=head;  //一样的点
	while(pCurrent!=NULL)
	{
		struct ListNode* tmp=pCurrent;
		pCurrent=pCurrent->next;
		tmp->next=newhead;   //把节点放在节点前面,插入到链表的最前端
		newhead=tmp;
	}
	return newhead;

}
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) 
{
	int length;
	struct ListNode* pCurrent=head;
	length=LengthList(pCurrent);
	int diff=n-m;
	if (diff==0)
	{
		return head;
	}
	if (m==1)
	{
		if (length==n)
		{
		
			head=reverseList(head);
			return head;
		}
		if (n<length)
		{
			pCurrent=head;
			while (diff--)   //
			{
				pCurrent=pCurrent->next;
			}
			struct ListNode* pCurrentNhead;
			pCurrentNhead=pCurrent->next;
			struct ListNode* pCurrentMTail=pCurrent;
			pCurrent->next=NULL; //first tail node.
			head=reverseList(head);
			pCurrent=head;
			while(pCurrent->next!=NULL)  //走到反转的地方n头结点的前面..  //另外一种方法m都头结点已经算是尾节点了。
			{
				pCurrent=pCurrent->next;
			}
			pCurrent->next=pCurrentNhead;
			return head;
		 }
	}
	else
		{
				if (length==n)
			     {
					struct ListNode* pCurrentHeadTail=head;
					pCurrent=head;
				     m--;
	 
				   while(m--)
				   {
					   pCurrentHeadTail=pCurrent;
					   pCurrent=pCurrent->next;
				   }
				   //分段
				   pCurrentHeadTail->next=NULL;
				   struct ListNode* pCurrentHeadm=pCurrent; 
				   pCurrent=pCurrentHeadm;
				   pCurrentHeadm=reverseList(pCurrentHeadm);
				   pCurrentHeadTail->next=pCurrentHeadm;
				   return head;
				  }
			if (n<length)
			{
					struct ListNode* pCurrentHeadTail=head;
					pCurrent=head;
					m--;
					while(m--)
					{
						pCurrentHeadTail=pCurrent;
						pCurrent=pCurrent->next;
					}
					//分段
					pCurrentHeadTail->next=NULL;
					struct ListNode* pCurrentHeadm=pCurrent; 
					while (diff--)
					{
						pCurrent=pCurrent->next;
					}
					struct ListNode* pCurrentNhead;
					pCurrentNhead=pCurrent->next;
					struct ListNode* pCurrentMTail=pCurrent;
					pCurrent->next=NULL;
					pCurrentMTail=pCurrentHeadm;
					pCurrentHeadm=reverseList(pCurrentHeadm);
					pCurrentHeadTail->next=pCurrentHeadm;
					pCurrentMTail->next=pCurrentNhead;
					return head;
			}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值