题目描述,
给定一个链表,存储的内容是1,2 3,4,5,6,7,8,9,0 共2n个数字,请设计算法,将其修改为 1 0 2 9 3 8 4 7 5 6
一定注意一些特殊用例,如果n=1情况
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct node
{
char data;
node *next;
} node,*pnode;
pnode head,p;
void print(pnode head)
{
p=head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void load1(pnode head,string str)
{
pnode t=head,tt;
for(int i=0; i<str.size(); i++)
{
tt=(pnode)malloc(sizeof(node));
tt->data=str[i];
tt->next=NULL;
t->next=tt;
t=t->next;
}
}
void change(pnode head,int n)
{
int n2=n/2;
int index=0;
pnode p1=head,p2,p3;
if(n2==1)
{
swap(p1->next->data,p1->next->next->data);
return ;
}
while(index++<n2)
{
p1=p1->next;
}
p2=p1->next;
p1->next=NULL;
index=1;
//后半部分逆转
p3=p2->next;
p2->next=NULL;
while(index++<n2)
{
p1=p3->next;
p3->next=p2;
p2=p3;
p3=p1;
}
//p2指向后半部分
//链表合并
p1=head->next; //p1指向 前半部分
index=0;
while(index++<n2)
{
p3=p1->next;
p1->next=p2;
p2=p2->next;
p1->next->next=p3;
p1=p3;
}
}
int main() {
head=(pnode)malloc(sizeof(node));
head->next=NULL;
load1(head,"1234567890");
print(head);
change(head,10);
print(head);
}