1、表元素逆序存储链表
代码:
#include<iostream>
using namespace std;
template <typename Object>
struct Node
{
Object data;
Node *next;
Node(const Object & d = Object{}, Node *n = nullptr) :data(d), next(n)
{}
};
template <typename Object>
Node<Object>*inverse(Node<Object>*head)
{
Node<Object> *a = head->next;//a指向第一个节点
Node<Object> *b;
head->next = NULL;
while (a != NULL)
{
b = a->next;//b指向a的下一个节点
a->next = head->next;//
head->next = a;//a反向连接head
a = b;//a指向原链表的下一个节点
}
return head->next;//重新指向头结节点,头节点的第一个节点指向head
}
int main()
{
typedef Node<int>node;
node *head = new node;
node *p, *q;
int n = 10;
p = head;
int v[10];
for (int i = 0; i < n; i++)
{
v[i] = i;
}
for (int i = 0; i < n; i++)
{
q = new node{ v[i],head };
p->next = q;
q->next = NULL;
p = q;
}
p = head->next;
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
p = inverse(head);
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return 0;
}
运行:
2、表元素逆序存储数组
代码:
#include<iostream>
using namespace std;
template <typename Object>
struct Node
{
Object data;
Node *next;
Node(const Object & d = Object{}, Node *n = nullptr) :data(d), next(n)
{}
};
template <typename Object>
void inverse(Object v[], int N)
{
for (int i = 0; i < N / 2; i++)
{
Object temp;
temp = v[i];
v[i] = v[N - i - 1];
v[N - i - 1] = temp;
}
}
int main()
{
typedef Node<int>node;
node *head = new node;
node *p, *q;
int n = 10;
p = head;
int v[10];
for (int i = 0; i < n; i++)
{
v[i] = i;
}
for (int i = 0; i < n; i++)
{
q = new node{ v[i],head };
p->next = q;
q->next = NULL;
p = q;
}
p = head->next;
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
inverse(v, n);
p = head;
for (int i = 0; i < n; i++)
{
q = new node{ v[i],head };
p->next = q;
q->next = NULL;
p = q;
}
p = head->next;
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return 0;
}
运行:
3、顺向建立链表
代码:
#include<iostream>
using namespace std;
template <typename Object>
struct Node
{
Object data;//数据域,用来记录数据
Node *next;//指针域,用来记录它的下一个节点的地址,访问这个变量能找到它的下一个节点
Node(const Object & d = Object{}, Node *n = nullptr) :data(d), next(n)
{}
};
int main()
{
typedef Node<int>node;
node *head = new node;//开辟内存,地址赋给head,head表示链表的头,访问head能找到这个链表
node *p, *q;//p是游动指针,建立链表时永远指向最后一个链节
int n = 10;
p = head;//初始状态下只有head一个链节,那么最后一个链节也是head,让p指向head
for (int i = 0; i < n; i++)
{
q = new node{ i,head };//给新链节的data赋值
p->next = q;//把q挂在p(初始值是head)的后面
q->next = NULL;//新链节是链表的最后的一个链节,后面没有后继,把它的next设为null
p = q;//q成为p的后继之后,q就是最后一个节点,规定p指向最后一个节点,就把q的值赋给p
}
p = head->next;//p在上面是指向最后一个元素,以便于增加新的链节后能很快的放在它的后面,达到添加链节的目的
while (p != nullptr)//NULL是链表结束的标志,当p访问不到NULL时,就会一直循环
{
cout << p->data << " ";//输出p访问到的每个节点的data值
p = p->next;//p访问本节点的next值,p就指向下一个节点,就相当于向后移动一个节点
}
cout << endl;
return 0;
}
运行: