题目描述
用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置。
注意不能简单交换两个结点包含数据,必须通过修改指针来实现两个结点的位置交换
交换函数定义可以参考:
swap(int pa, int pb) //pa和pb表示两个结点在单链表的位置序号
swap (ListNode * p, ListNode * q) //p和q表示指向两个结点的指针
输入
第1行先输入n表示有n个数据,接着输入n个数据
第2行输入要交换的两个结点位置
第3行输入要交换的两个结点位置
输出
第一行输出单链表创建后的所有数据,数据之间用空格隔开
第二行输出执行第1次交换操作后的单链表数据,数据之间用空格隔开
第三行输出执行第2次交换操作后的单链表数据,数据之间用空格隔开
如果发现输入位置不合法,输出字符串error,不必输出单链表
样例输入
5 11 22 33 44 55
1 4
2 6
样例输出
11 22 33 44 55
44 22 33 11 55
error
代码
#include<bits/stdc++.h>
using namespace std;
struct NODE{
int data;
NODE *next;
NODE (){
next=NULL;
data=-1;
}
};
int n;
void display(NODE *head){
NODE *node=head;
while(node->next){
node=node->next;
cout<<node->data<<" ";
}
cout<<endl;
}
bool swap(int x,int y,NODE *head){
if(x<=0 || x>n || y<=0 || y>n) return false;
NODE *a=head;
for(int i=1;i<x;i++){
a=a->next;
}
NODE *b=a->next;
NODE *c=head;
for(int i=1;i<y;i++){
c=c->next;
}
NODE *d=c->next;
// cout<<a->data<<" "<<b->data<<" "<<c->data<<" "<<d->data<<endl;
a->next=d->next;
c->next=b->next;
b->next=a->next;
d->next=c->next;
a->next=d;
c->next=b;
return true;
}
int main(){
cin>>n;
NODE *head=new NODE;
NODE *tail=head;
for(int i=1;i<=n;i++){
int x;
cin>>x;
NODE *res=new NODE;
res->data=x;
tail->next=res;
tail=res;
}
display(head);
int t=2;
while(t--){
int x,y;
cin>>x>>y;
if(swap(x,y,head)){
display(head);
}
else{
puts("error");
}
}
return 0;
}