单链表原地逆置
![在这里插入图片描述]()
![在这里插入图片描述]()
List Reverse(List L1){
List L2;
List t = L1;
List q = (List)malloc(sizeof(List));
List p = q;
t = t->Next;
while(t != nullptr){
PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));
s->Data = t->Data;
q->Next = s;
t = t->Next;
if(t == nullptr){
q = q->Next;
q->Next = nullptr;
break;
}
q = q->Next;
}
List prev = nullptr;
List head = p->Next;
List next = p->Next->Next;
while(head != nullptr){
head->Next = prev;
prev = head;
head = next;
if(head == nullptr){
break;
}
next = next->Next;
}
List first = (List)malloc(sizeof(List));
first->Next = prev;
L2 = first;
return L2;
}
单链表利用栈逆置
![在这里插入图片描述]()
List Reverse_stack(List L1){
List L2 = (List)malloc(sizeof(PtrToNode));
List L3 = L2;
L1 = L1->Next;
while(L1 != nullptr){
List_stack.push(L1->Data);
L1 = L1->Next;
}
const int List_stack_size = List_stack.size();
for(int i = 0; i < List_stack_size; i++){
PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));
s->Data = List_stack.top();
L2->Next = s;
L2 = L2->Next;
List_stack.pop();
if(List_stack.empty()){
L2->Next = nullptr;
}
}
return L3;
}
.cpp文件
#include<bits/stdc++.h>
using namespace std;
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
stack<ElementType> List_stack;
List Read(){
List list = (List)malloc(sizeof(List));
List p = list;
int N;
int value = 0;
scanf("%d",&N);
for(int i = 0; i < N; i++){
PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));
scanf("%d",&value);
s->Data = value;
s->Next = nullptr;
list->Next = s;
list = list->Next;
}
return p;
}
void Print(List list){
List p = list->Next;
while(p != nullptr){
printf("%d ",p->Data);
p = p->Next;
}
printf("\n");
}
List Reverse(List L1){
List L2;
List t = L1;
List q = (List)malloc(sizeof(List));
List p = q;
t = t->Next;
while(t != nullptr){
PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));
s->Data = t->Data;
q->Next = s;
t = t->Next;
if(t == nullptr){
q = q->Next;
q->Next = nullptr;
break;
}
q = q->Next;
}
List prev = nullptr;
List head = p->Next;
List next = p->Next->Next;
while(head != nullptr){
head->Next = prev;
prev = head;
head = next;
if(head == nullptr){
break;
}
next = next->Next;
}
List first = (List)malloc(sizeof(List));
first->Next = prev;
L2 = first;
return L2;
}
List Reverse_stack(List L1){
List L2 = (List)malloc(sizeof(PtrToNode));
List L3 = L2;
L1 = L1->Next;
while(L1 != nullptr){
List_stack.push(L1->Data);
L1 = L1->Next;
}
const int List_stack_size = List_stack.size();
for(int i = 0; i < List_stack_size; i++){
PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));
s->Data = List_stack.top();
L2->Next = s;
L2 = L2->Next;
List_stack.pop();
if(List_stack.empty()){
L2->Next = nullptr;
}
}
return L3;
}
int main()
{
List L1, L2, L3;
L1 = Read();
L2 = Reverse(L1);
L3 = Reverse_stack(L2);
cout << "显示输入的单链表数据:";
Print(L1);
cout << "单链表原地逆置:\n先构造原链表的副本,然后从头逐个拆开这个副本,逐个逆置成逆序链表: \n";
Print(L2);
cout << "单链表利用栈逆置:\n把第一次逆置后的链表从头逐个压栈,再逐个弹出栈赋值给新逆置链表的结点\n";
Print(L3);
return 0;
}
运行结果
E:\CODING__ALAN_CF\cmake-build-debug\Single_linkList_Reverse.exe
5
1 2 3 4 5
显示输入的单链表数据:1 2 3 4 5
单链表原地逆置:
先构造原链表的副本,然后从头逐个拆开这个副本,逐个逆置成逆序链表:
5 4 3 2 1
单链表利用栈逆置:
把第一次逆置后的从头逐个压栈,再逐个弹出栈赋值给新逆置链表的结点
1 2 3 4 5
进程已结束,退出代码为 0