设计算法,通过一趟遍历,将链表中所有结点的链接方向逆转,仍利用原来的存储空间
#include <iostream>
#define overflow -2
#define ok 1
#define error 0
using namespace std;
typedef int status;
typedef int ElemType;
//定义
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode , *LinkList;
//初始化
status InitList(LinkList &LA)
{
LA = new LNode; //生成一个新结点
LA->next = NULL; //结点指针域置空
return ok;
}
//创建一个长度为n的单链表
status CreatList_R(LinkList &LA, int n)
{
LNode *r = LA; //尾指针初始化指向头结点
for (int i = 0; i < n; i++)
{
LNode *p = new LNode; //生成新结点
cin >> p->data; //输入的数据存放在新结点的数据域
r->next = p;
p->next = NULL;
r = p;
}
return ok;
}
//输出
int DispList(LinkList L)
{
LNode *p = L->next;
while (p)
{
cout << p->data << ' ';
p = p->next;
}
return ok;
}
//逆转结点链接方向
/*----------------------------------------------*
分析:
就相当于是将一个链表倒着输出
从首元结点开始,逐个把链表L的当前结点p,插入新的链表头部 ,也就是头插法
*------------------------------------------------*/
status Inverse(LinkList &L)
{ //逆置带头结点的单链表L
LNode *p = L->next;
L->next = NULL;
while (p)
{
LNode *q = p->next; //生成新结点指向p的后继结点
p->next = L->next;
L->next = p; //*p插在头结点之后 (头插法)
p = q;
}
}
//主函数
int main()
{
int n;
LinkList L;
InitList(L);
cout << "输入元素个数:" ;
cin >> n ;
cout << endl;
cout << "请输入线性表元素:" << ' ' ;
CreatList_R(L, n);
cout << endl;
cout << "逆转之后的链表为 :" ;
Inverse(L);
DispList(L);
return 0;
}