题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* tmp = head;//特别有用的一个中转节点
ListNode*s = NULL;
ListNode*pHead = head;
ListNode*pende = head;
ListNode*nex = NULL;
ListNode*pre = NULL;
int n = 0;
while(tmp)
{
tmp = tmp->next;
n++;
}//根据链表是以节点的方式进行链接的,所以这里用指针指到空的时候,对应的n值就是链表中节点的个数
tmp = head;
if(k>n||(k == 1))
{
s = head;
}
else
{
n = n-k; //这里的不能这么简单赋值
for(int i =0;i<k-1;++i)//注意这里不要循环太多次了
{
s = tmp->next;
tmp = tmp->next;
}
while(n>=0)
{ //设置第二次反转开始的头节点
for(int i = 0 ;i<k;++i)//设置要反转到后一个节点
{
pende = pende->next;
}
if(n>=k)//考虑到反转后第一个节点的指向要后移动很多位
{
tmp = pende;
for(int i =0;i<k-1;i++)//考虑到反转后第一个节点的指向要后移动很多位
{
pre = tmp->next;
tmp =tmp->next;
}
}
else{ //如果只是反转一次,那么就可以不用后移动很多位
pre = pende;
}
while(pHead!=pende)
{
nex = pHead->next;
pHead->next = pre;
pre = pHead;
pHead = nex;
}
n = n-k;
}
}
return s;
}
};