题解 | #链表中的节点每k个一组翻转#
二分查找-I
http://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b
/**
- struct ListNode {
- int val;
- struct ListNode *next;
- }; */
class Solution { public: /** * * @param head ListNode类 * @param k int整型 * @return ListNode类 / ListNode reverseKGroup(ListNode* head, int k) { // write code here ListNode* tmp = head;//特别有用的一个中转节点 ListNode*s=NULL;
ListNode*pHead = head;
ListNode*pend = NULL;
ListNode*pende = head;
ListNode*nex = NULL;
ListNode*pre = NULL;
int n = 0;
while(tmp)
{
tmp = tmp->next;
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;
}
tmp = head;
for(int i =0 ;i<k-1;++i)
{
pend = tmp->next;
tmp = tmp->next;
}
tmp = head;
for(int i =0 ;i<k;++i)
{
pende = tmp->next;
tmp = tmp->next;
}
if(n>=k)//考虑到反转后第一个节点的指向要后移动很多位
{
tmp = pende; //这里需要设置一个tmp,要步后面的循环就不对
for(int i =0;i<k-1;i++)//考虑到反转后第一个节点的指向要后移动很多位
{
pre = tmp->next;
tmp=tmp->next;
}
}
//如果只是反转一次,那么就可以不用后移动很多位
else{
pre = pende;
}
while(pHead!=pende)//这里不应该是设置pende,这里还是根据区间来定
{
nex = pHead->next;
pHead->next = pre;
pre = pHead;
pHead = nex;
}
n = n-k;
while(n>=0)
{
//设置第二次反转开始的头节点
pHead = pende;
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;
}
};