目录
线性表的就地逆置
以单链表作为存储结构,实现线性表的就地逆置。
分析
将链表断开为一个头结点和一个新的链表,将新的链表的各个节点从头到尾依次用头插法插入到之前断开的头结点之后。
带头结点的单链表所表示的线性表就地逆置:
p指针指向的的是将头插入逆置链表的结点,q指针指向该结点下一个结点;每次头插入一个结点到逆置单链表后,p指针指向q所在位置(即下一个需要插入的结点),则当p指针指空时,原单链表中的所有结点已头插到逆置单链表中。
void LinkList::inversion(){
Node *p=first->next,*q;
first->next=0;
while(p){
q=p->next;
p->next=first->next;
first->next=p;
p=q;
}
}
后接方式建单链表
若前插方式建立的单链表,从头指针开始顺链访问单链表元素结点所得到的数据次序会和cin输入数据次序相反,故采用后插法建立单链表。
LinkList::LinkList(int a[], int n){
first = new Node;
first->next = NULL;
Node *r=first;
for (int i = 0; i < n; i++){
Node *s = new Node;
s->data = a[i];
r->next = s;
r=s;
}
r->next=NULL;
}
完整代码
#include<iostream>
using namespace std;
/*单链表的就地逆置:将链表断开为一个头结点和一个新的链表,
将新的链表的各个节点从头到尾依次用头插法插入到之前断开的头结点之后*/
struct Node
{
int data;
Node *next;
};
class LinkList {
public:
LinkList();
LinkList(int a[], int n);
~LinkList();
void inversion();
void PrintList();
private:
Node *first;
};
//后接方式建单链表
LinkList::LinkList(int a[], int n){
first = new Node;
first->next = NULL;
Node *r=first;
for (int i = 0; i < n; i++){
Node *s = new Node;
s->data = a[i];
r->next = s;
r=s;
}
r->next=NULL;
}
LinkList::~LinkList(){
Node *d;
while (first){
d = first;
first = first->next;
delete d;
}
}
void LinkList::inversion(){
Node *p=first->next,*q;
first->next=0;
while(p){
q=p->next;
p->next=first->next;
first->next=p;
p=q;
}
}
void LinkList::PrintList(){
Node *p=first->next;
while(p){
cout<<p->data;
p=p->next;
}
cout<<endl;
}
void main(){
int n;
int a[100];
cout << "请输入链表元素的个数:" << endl;
cin >> n;
cout<<endl;
cout << "请输入链表元素:" << endl;
for (int i = 0;i < n;i++){
cin >> a[i];
}
LinkList link = LinkList(a, n);
cout << "原链表元素:\n" << endl;
link.PrintList();
link.inversion();
cout << "逆置后链表元素:\n" << endl;
link.PrintList();
system("pause");
}
运行截图