/单向链表操作/ 节点对换 C++版
创建node节点类ListNode,与链表类LinkList,属性均为public
#include <iostream>
using namespace std;
#define ok 0
#define error -1
class ListNode {
public:
int data;
ListNode *next;
ListNode() {
next=NULL;
}
};
class LinkList {
public:
ListNode *head;
int len;
LinkList() {
len=0;
head=new ListNode;
}
~LinkList() {
ListNode *p,*q;
q=head;
while (q) {
p=q;
q=q->next;
delete p;
}
head=NULL;
len=0;
}
int LL_insert(int i,int item);
int LL_del(int i);
int LL_swap(int pa,int pb);
void LL_display();
};
int LinkList::LL_insert(int i,int item) {
int j=0;
ListNode *p=head;
while (p->next&&j<i) {
p=p->next;
j++;
}
if (!p&&j!=i||i<1) return error;
ListNode *q=new ListNode;
if (p->next) {
q->next=p->next;
p->next=q;
q->data=item;
}
else {
p->next=q;
q->next=NULL;
q->data=item;
}
len++;
return ok;
}
int LinkList::LL_del(int i) {
if (len<i||i<1) return error;
int j=1;
ListNode *p=head->next;
ListNode *pre;
while (j<i&&p->next) {
pre=p;
p=p->next;
j++;
}
if (p->next) {
pre->next=p->next;
delete p;
}
else {
delete p;
pre->next=NULL;
}
return ok;
}
int LinkList::LL_swap(int pa,int pb) {
if (pa<pb) {
pa=pa+pb;
pb=pa-pb;
pa=pa-pb;
}//交换pa,pb值,使pa>pb
if (pa>len||pb<1) return error;
int ja,jb;
ja=jb=1;
ListNode *pta,*ptb;//节点的前一个指针
pta=ptb=head;
while (jb<pb) {
ptb=ptb->next;
jb++;
}
ListNode *nb=ptb->next;//前节点
while (ja<pa) {
pta=pta->next;
ja++;
}
ListNode *na=pta->next;//后节点
if (nb->next==na) { //两节点相邻
if (na->next) {
nb->next=na->next;
ptb->next=na;
na->next=nb;
}
else {
ptb->next=na;
na->next=nb;
nb->next=NULL;
}
return ok;
}
if (na->next) {
ListNode *tempb=nb->next;
ListNode *tempa=na->next;
ptb->next=na;
na->next=tempb;
nb->next=tempa;
pta->next=nb;
}
//两节点不相邻
else {
na->next=nb->next;
ptb->next=na;
pta->next=nb;
nb->next=NULL;
}
return ok;
}
void LinkList::LL_display() {
ListNode *p=head;
while (p->next) {
p=p->next;
cout<<p->data<<' ';
}
cout<<endl;
}
int main() {
LinkList *list=new LinkList;
int n;cin>>n;
for (int i=0;i<n;i++) {
int item;cin>>item;
list->LL_insert(i+1,item);
}
list->LL_display();
int la,lb;
cin>>la>>lb;
list->LL_swap(la,lb);
list->LL_display();
//删除第delLoc个操作
int delLoc;
cin>>delLoc;
list->LL_del(delLoc);
list->LL_display();
return 0;
}