首页 > 其他 > 详细

leetcode025:Reverse Nodes in k-Group

时间:2015-04-16 14:21:06      阅读:94      评论:0      收藏:0      [点我收藏+]

问题描述

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

问题分析

以k个结点为一组,逆转组内结点后连接起来,是leetcode024的升级版本(k=2)。解题思路比较清晰,先查看是否有足够的结点构成一组,有则逆转,不够则直接连接起来。难点是链表操作的先后复制要清晰,否则容易混乱。下面以链表为12345678,k=2为例说明链表复制的过程(链表逆转逻辑比较简单,这里不提)。
  • ans是最终结果的表头;
  • ans_p负责组间的连接工作;
  • p负责检查是否有k个结点逆转;
  • p1用来记录逆转前的组的表头;
  • q为逆转过程中的表头。

技术分享

代码

//运行时间:<span style="font-family:Helvetica Neue, Helvetica, Arial, sans-serif;color:#333333;"><span style="font-size: 14px; line-height: 20px; background-color: rgb(249, 249, 249);">38ms</span></span>
class Solution {
public:
	ListNode *reverseKGroup(ListNode *head, int k) {
		if (!head) return NULL;
		if (k<=1) return head;
		ListNode *ans = NULL;
		ListNode *ans_p = head;
		ListNode *p = head;//前进!
		ListNode *p1;
		ListNode *q = head;
		ListNode *x;
		ListNode *y;
		int count ;
		while (1){
			count = 0;
			p1 = p;
			while (p&&count < k){
				count++;
				p = p->next;
			}
			if (count < k) {
				if (!ans)	ans = p1; 
				else{ ans_p->next = p1; }
				break;
			}
			else{
				x = y = q->next;
				count = 1;
				while (count < k){
					x = x->next;
					y->next = q;
					q = y;
					y = x;
					count++;
				}
				if (!ans) { ans = q; ans_p = p1; }
				else { ans_p->next = q; ans_p = p1; }
				q = p;
			}
			if (!p) break;
		}
		return ans;
	}
};



leetcode025:Reverse Nodes in k-Group

原文:http://blog.csdn.net/barry283049/article/details/45073837

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!