使用链表创建时,使用前插法的时候,输入顺序跟输出顺序是相反的,因此请编写类的reverse成员函数,实现链表的转置,使其顺序与输入相同。
测试输入 | 期待的输出 | |
测试用例 | 1 2 0 | the result is: 1 2 |
代码:
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
using namespace std;
class List; //前视定义,否则友元无法定义
class LinkNode
{
friend class List; //链表结点类的定义
private:
LinkNode *link;
int data;
public:
LinkNode (LinkNode *ptr = NULL) {link=ptr;}
LinkNode(const int & item, LinkNode *ptr = NULL){ data=item;link=ptr;}
~LinkNode(){};
};
class List
{//单链表类的定义
private:
LinkNode *first; //指向首结点的指针
public:
List (int x) { first = new LinkNode (x);} // 带头结点
~List (){MakeEmpty();} //析构函数
void MakeEmpty ( ); //链表置空
void input(int endTag);
void reverse();
void output();
};
void List:: MakeEmpty ( )
{
LinkNode *q;
while ( first->link != NULL )
{q = first->link;
first->link = q->link;//将表头结点后第一个结点从链中摘下
delete q; //释放它
}
};
void List :: input (int endTag){
LinkNode *newnode; int val;
cin>>val;
while(val!=endTag)
{
newnode=new LinkNode (val);
if (newnode==NULL)
{cerr<<"存储分配错误"<<endl;exit(1);}
newnode->link=first->link;
first->link=newnode;
cin>>val;
}
}
void List ::output ( ) {//依次输出各结点的值
LinkNode *p=first->link;
while(p!=NULL) {
cout<<p->data<<' ';
p=p->link;
}
cout<<endl;
}
int main()
{
List l(0);
l.input(0);
l.reverse ();
cout<<"the result is:"<<endl;
l.output ();
return 1;
}
void List::reverse()
{
LinkNode *temp,*temp0;
if(first==NULL||first->link==NULL)
{
}
else
{
temp=first->link;
while(temp->link!=NULL)
{
temp0=temp->link;
temp->link=temp0->link;
temp0->link=first->link;
first->link=temp0;
}
}
}