西工大数据结构NOJ002:线性表的就地逆置
一个顺序表类和一个链表类,顺序表中使用一个Reverse函数,作用是完成顺序表的逆序
而在链表中,在main函数里面输入数据的过程中,我直接使用了头插法创建链表,所以得到的链表就是逆序的
其实也可以写一个链表反转的函数,我写在里面,但没有使用,可以参考,其实和头插法的原理是一样的
#include <iostream>
using namespace std;
#define MAXSIZE 200
struct SqList{
int elem[MAXSIZE];
int length;
SqList(int length){
this->length=length;
}//直接使用构造函数,在造对象的时候长度就可以根据输入确定了
void PrintList(){
for(int i=0;i<length;i++){
cout<<elem[i]<<" ";
}
cout<<endl;
}
void Reverse(){
// 通过双指针进行交换,就是停的换直到这两个指针相遇
int left=0,right=length-1;
while(left<right){
int tmp;
tmp=elem[left];
elem[left]=elem[right];
elem[right]=tmp;
right--;
left++;
}
}
};
struct LNode{
int data;
LNode *next;
};
struct LinkList{
LNode *head;
LinkList(){
head = new LNode();
}
void PrintLinkList(){
LNode *p=head;
while(p->next){
p=p->next;
cout<<p->data<<" ";
}
}
void Reverse(){
LNode *p=head->next;
head->next=nullptr;
while(p){
LNode *s = p;
p=p->next;
s->next=head->next;
head->next=s;
}
}
};
int main() {
int length;
cin>>length;
SqList l1(length);
LinkList l2;
int i;
for(i=0;i<length;i++) {
LNode *s = new LNode();
cin>>l1.elem[i];
// 通过头插法创建链表之后链表自然就是逆序
s->next=l2.head->next;
s->data=l1.elem[i];
l2.head->next=s;
}
l1.Reverse();
l1.PrintList();
l2.PrintLinkList();
return 0;
}