题目:
原链表为1->2->3->4->5->6->7
k=3的子段逆转结果为
3->2->1->6->5->4->7
code:
关键点
首子段要记录整个链表的头指针,记录相邻两字段的尾节点
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <hash_map>
using namespace std;
typedef struct node
{
int data;
struct node* next;
}*pList,Node;
void rReverse(pList &list,int k)
{
pList p=list, tail, pretail;
tail=p;
int flag=0;
while(p!=NULL)
{
int n=k;
pList post=p->next;
tail=p;
while(post!=NULL && n--!=1)
{
pList temp=post->next;
post->next=p;
p=post;
post=temp;
}
if(post!=NULL && flag==0)
{
list=p;
pretail=tail;
flag=1;
p=post;
}
else if(post!=NULL)
{
pretail->next=p;
pretail=tail;
p=post;
}
else
{
pretail->next=p;
tail->next=NULL;
break;
}
}
}
int s[7]={1,2,3,4,5,6,7};
void createList(pList& head)
{
head=new Node;
pList p=head;
for(int i=0;i<7;i++)
{
p->next=new Node;
p->next->data=s[i];
p=p->next;
}
p->next=NULL;
p=head;
head=head->next;
delete p;
}
void showList(pList head)
{
pList p=head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(void)
{
pList head;
createList(head);
showList(head);
rReverse(head,4);
showList(head);
system("pause");
return 0;
}
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LclXS61EeFpWTqBnMZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN1AzNwMzMwETNwkDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)