先看一下题目:以单链表做存储结构,写一实现线性表的就地逆置算法
两种思路:
1、采用头插法新建单链表时,得到的单链表数据域所组成的序列刚好是输入序列的逆序,所以这里的单链表的就地逆置可以考虑头插法实现,即将数据域第一个结点后的结点取出,再将取出的结点插入到头结点之后,重复操作,直至原第一个结点到达最后(next指针为空)
2、设置标志位,在结点的数据域添加flag标志。逆置操作其实就是把第i个和第n-i个结点的数据域中data值互换,这里可以设置flag标志,来达到i和n-i互换的目的。
C++实现如下(注释部分代码为头插法就地逆置的实现):
#include <iostream>
using namespace std;
struct Node//用于思路1
{
int data;
Node *next;
};
struct Note//用于思路2
{
int data, flag=0;
Note *next;
};
class LinkList
{
public:
LinkList(int a[], int n);//初始化单链表
void Inversion();//单链表的逆置操作,蛮力法的思想
void Print();//输出单链表
void Swap(int &a, int &b);//交换值
private:
//Node *p, *q,*r,*first;
Note *p, *q, *r, *first;
};
LinkList::LinkList(int a[], int n)//尾插法建立单链表
{
//first = new Node;
first= new Note;
Note *s;
r = first;
for (int i = 0; i < n