【数据结构】问题 C: DS单链表–结点交换
题目描述
用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 <iostream>
using namespace std;
#define ok 0
#define error -1
class Node{
public:
int data;
Node *next;
Node() {next = NULL;}
};
class LinkList{
public:
Node *head;
int len;
LinkList(){
head = new Node();
head->next = NULL;
len=0;
}
~LinkList(){
Node *p;
while(head){
p=head;
head=head->next;
delete p;
}
}
int LL_create(int n){//向新建的链表插入n个数据
int item;
len+=n;
Node *p=head;
while(p->next){
p=p->next;
}
while(n--){
cin>>item;
Node *q=new Node;
q->data=item;
q->next=NULL;
p->next=q;
p=q;
}
}
void LL_display(){
Node *p=head->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int swap(int pa,int pb){
if((pa<=0 || pa>len) || (pb<=0 || pb>len)){
return error;
}
Node *a,*a_prev,*a_next,*b,*b_prev,*b_next;
Node *p=head->next;
if(pa==1){
int j=0;
while(j<pb-1){
b_prev=p;
p=p->next;
j++;
}
b=p;
b_next=b->next;
a=head->next;
a_next=a->next;
a->next=b_next;
b_prev->next=a;
b->next=a_next;
head->next=b;
return ok;
}
else{
int j=0;
while(j<pa-1){
a_prev=p;
p=p->next;
j++;
}
a=p;
a_next=a->next;
j=0;
p=head->next;
while(j<pb-1){
b_prev=p;
p=p->next;
j++;
}
b=p;
b_next=b->next;
b->next=a_next;
a_prev->next=b;
a->next=b_next;
b_prev->next=a;
return ok;
}
}
};
int main(){
int n,pos1,pos2;
LinkList L;
cin>>n;
L.LL_create(n);
L.LL_display();
cin>>pos1>>pos2;
if( L.swap(pos1,pos2)==-1)
cout<<"error"<<endl;
else L.LL_display();
cin>>pos1>>pos2;
if( L.swap(pos1,pos2)==-1)
cout<<"error"<<endl;
else L.LL_display();
return 0;
}