Leetcode【24】:Reverse Nodes in k-Group

题目:是23题2个结点一翻转的扩展,给一个链表,K个结点一翻转,最后不够K个的不改变。

分析:可以用递归做,觉得不好搞,就用了迭代。定义reverseList函数用来翻转K个结点的list。

class Solution{
public:
	ListNode *reverseKGroup(ListNode *head, int k) {
		ListNode dummy(-1);
		dummy.next=head;//定义一个虚结点方便。
		ListNode *newHead,*newPrev;//
		newHead=newPrev=&dummy;
		int count=0;
		ListNode *pNode=head;//pNode用来遍历。
		ListNode *pPrev=head;
		while(pNode){
			count++;//到K时要翻转
			ListNode *pNext=pNode->next;
			if(count==k){
				newPrev->next=reverseList(pPrev,pNext);//newPrev保存的是已翻转好的链表最后一个结点。
				newPrev=pPrev;//pPrev保存的是待翻转短链表的首结点
				pPrev=pNext;//此时的pNext是待翻转链表的后一个结点
				count=0;
			}
			pNode=pNext;
		}
		newPrev->next=pPrev;由于reverseList会导致前后断链,必须把最后的尾巴链给接上。
		return dummy.next;
	}
	ListNode *reverseList(ListNode *head, ListNode *rear){//翻转head到rear的链表(不包括rear结点)
		ListNode *newHead=NULL;
		ListNode *pNode=head;
		while(pNode!=rear){
			ListNode *pNext= pNode->next;
			pNode->next=newHead;
			newHead=pNode;
			pNode=pNext;
		}
		return newHead;//注意由于是不断地插入待逆置的结点,会导致前后断链。
	}
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值