将链表的元素逆转,要求算法的空间复杂度为O(1).
拷贝下面的代码,将后插法建链表的代码填入,然后再完成inverse函数(不允许使用线性表ADT中的方法)。
#include<iostream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode {
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
void CreateList_R(LinkList &L, int n) //算法2.12 后插法创建单链表
{
/****在此下面完成代码***************/
/***********************************/
}
void inverse(LinkList &L)
{
/****在此下面完成代码***************/
/***********************************/
}
void ListPrint(LinkList L)
{
LNode *p;
for(p = L->next; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
LinkList L;
int n;
cin >> n;
CreateList_R(L, n);
inverse(L);
ListPrint(L);
}
输入
输入包括两行。
第一行是一个整数n,表示链表中的元素个数。
第二行是n个空格分开的整数,为各元素值。
输出
输出逆转后的链表。
样例输入 Copy
5 1 2 3 4 5
样例输出 Copy
5 4 3 2 1
//方法一:
#include<iostream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode {
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
void CreateList_R(LinkList &L, int n) //算法2.12 后插法创建单链表
{
/****在此下面完成代码***************/
{
L=new LNode;
L->next=NULL;
int i;
LinkList p=L;
for(i=1;i<=n;i++){
LinkList s;
s=new LNode;
scanf("%d",&s->data);
s->next=NULL;
p->next=s;
p=s;
}
}
/***********************************/
}
void inverse(LinkList &L)
{
/****在此下面完成代码***************/
LNode *p,*s,*q;
p=L->next;
L->next=NULL;//先将其滞空,用于之后尾插法使用
while(p)
{
q=p->next;//将q等于p->next保存起来,为后面的循环伏笔
p->next=L->next;//第一次循环将p->next=NULL,后面几次循环就是将一个一个接在这个前面
L->next=p;//就是将头节点L连接p的前面
p=q;//为再一次循环做准备
}
/***********************************/
}
void ListPrint(LinkList L)
{
LNode *p;
for(p = L->next; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
LinkList L;
int n;
cin >> n;
CreateList_R(L, n);
inverse(L);
ListPrint(L);
}
//方法二:
#include<iostream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode {
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
void CreateList_R(LinkList &L, int n) //算法2.12 后插法创建单链表
{
/****在此下面完成代码***************/
L=new LNode;
L->next=NULL;
int i=0;
for(i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->data;
p->next=L->next;//后面我想了想也可以用一个输入段就可以解决
L->next=p;//与上面那道题的思路大致相同
//这个就是灵机一现,然后去试试敲了一下,没想到就成功了
}
/***********************************/
}
void ListPrint(LinkList L)
{
LNode *p;
for(p = L->next; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
LinkList L;
int n;
cin >> n;
CreateList_R(L, n);
ListPrint(L);
}
非常欢迎大家能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!