题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode*partreverse(struct ListNode*head,int m,int n)
{
struct ListNode *p = head, *pre, *temp, *s, *r;
int i, j;
s = head; //初始化s
for (i = 1; i < m; i++)
{
s = p;
p = p->next;
}
r = pre = p;//找到要翻转的位置
p = p->next;//将p指向下一位准备翻转
for (j = m; j < n; j++)
{
temp = pre;//保留其前节点的位置
pre = p;//将pre更新
p = p->next;//更新p
pre->next = temp;//将后一节点的next指向前一节点
}//for循环使链表反转
s->next = pre;//反转过后使前节点(s)指向翻转后的头结点
r->next = p;//翻转后的尾结点指向后面的节点(p)
if (m == 1)
return pre;//特殊情况,当m == 1时,头结点发生变化,此时的头为pre
return head;//一般情况,返回head
}
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
struct ListNode* p = head;//初始化p
int n = 0;//用来给节点计数
while (p != NULL)
{
p = p->next;
n++;
}
if(n == 0 || k > n)
return head;
//判断特殊情况:当链表为空或者k>n时,直接返回原链表
p = head;//重新初始化
int times = n/k;//计算需要翻转的次数
int j ,t = 1;//j,t为循环变量
for(j = 0;j < times;j++)
{
p = partreverse(p,t,t+k-1);//翻转第t到t+k-1项,并且返回头指针
t += k;//更新t,准备翻转下一组
}
return p;
//最后,因为翻转的过程中head发生变化,而p始终为头指针,故返回p
}
};


