// 单链表倒置
#include <iostream>
#include <functional>
#include <thread>
using namespace std;
struct Node
{
int data;
struct Node *next;
};
class ListInversion
{
private:
struct Node *head;
void Func(struct Node *p);
public:
ListInversion(); // 构造函数
void recursion(); // 递归
void headInsert(); // 头插法
void print();
};
ListInversion::ListInversion()
{
struct Node *temp, *p;
p = new struct Node;
p->data = 0;
p->next = nullptr;
head = p;
for (int i = 1; i < 6; i++)
{
temp = new struct Node;
temp->data = i;
temp->next = nullptr;
p->next = temp;
p = temp;
}
}
void ListInversion::print()
{
struct Node *temp = head;
while (temp != nullptr)
{
cout << temp->data << " ,";
temp = temp->next;
}
}
void ListInversion::Func(struct Node *p)
{
static int flg = 0;
if(p->next->next != nullptr)
{
Func(p->next);
}
// 标记新的头节点
if(flg == 0)
{
head = p->next;
flg = 1;
}
p->next->next = p;
p->next = nullptr;
}
void ListInversion::recursion()
{
struct Node *temp = head;
Func(temp);
}
void ListInversion::headInsert()
{
// 维护头节点
struct Node *p1 = head->next, *p2 = p1;
int flg = 0; // 标记头节点
while (p1 != nullptr)
{
if(flg == 0)
{
head->next = nullptr;
flg = 1;
}
p1 = p1->next;
p2->next = head;
head = p2;
p2 = p1;
}
}
int main()
{
ListInversion l;
l.print();
cout << endl;
l.recursion();
l.print();
cout << endl;
l.headInsert();
l.print();
system("pause");
exit(0);
}
03-20