目录
一、思路
二、代码
三、测试
四、总结
一、思路
反转链表,就是改变链表的结点指向,这里我们来分析以下需要的操作以及相应的注意点。
1.反转链表需要将当前结点的指针域指向前驱结点,所以第一我们需要找到当前结点
2.第二,需要找到前驱结点的地址
3.这时,还有一个问题,那就是如果改变了当前结点的指向,那么我们的后继结点就会丢失,所以我们需要保存后继结点
综上我们需要三个指针变量来表示这些关系
二、代码
#include<iostream>
#include "malloc.h"
using namespace std;
typedef struct LNode {
int data;
struct LNode * next;
}LNode, *LinkList ;
int tail_create_heahLinked_List(LinkList & L,int n)
{
if( n <= 0)
return 1;
LinkList head = (LinkList)malloc(sizeof(LNode));//头结点的存储地址
if(NULL == head) return 1; //分配空间失败
L = head; //头指针L存储头结点P的地址,即头指针指向头结点
L->data = 0; //用头结点统计元素个数,刚开始为0个
L->next = NULL; //此时链表为空
LinkList temp = L;
for(int i = 0;i<n;i++)
{
LinkList List_Node = (LinkList)malloc(sizeof(LNode));
scanf("%d",&List_Node->data);
L->data++;
List_Node->next = NULL; //每插入一个元素,头结点统计链表元素个数加一
temp->next = List_Node; //尾插法,即链表中的元素顺序与输入相同
temp = temp->next;
if(i == n-1 ){
temp->next = NULL;
}
}
return 0;
}
LinkList reverse_LinkList(LinkList L)
{
if( NULL == L || NULL == L->next || L->data == 0)
return NULL;
LinkList reversed_Head = NULL;
LinkList self_Node = L->next;
LinkList front_Node = NULL;
while(self_Node != NULL)
{
LinkList next_Node = self_Node->next;
if(next_Node == NULL)
reversed_Head = self_Node;
self_Node->next = front_Node;
front_Node = self_Node;
self_Node = next_Node;
}
//创建头结点
LinkList head_Node = (LinkList)malloc(sizeof(LNode));
head_Node->next = reversed_Head;
head_Node->data = L->data;
free(L);
LinkList new_LinkList = head_Node;
return new_LinkList;
}
void headlinked_List_Traverse(LinkList L)
{
cout<<"该链表的元素个数为:"<<L->data<<endl;
LinkList p = L->next;
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
int destroy_linked_list(LinkList L)
{
LinkList p;
while(L)
{
p = L->next;
free(L);
L = p;
}
cout<<"销毁链表成功"<<endl;
return 0;
}
int main()
{
int num;
cin>>num;
LinkList L =NULL;
if(!tail_create_heahLinked_List(L,num))
{
headlinked_List_Traverse(L);//打印链表
LinkList middle_Node =NULL;
L = reverse_LinkList(L);
headlinked_List_Traverse(L);
}
else
cout<<"请输入大于0的整数"<<endl;
destroy_linked_list(L);
return 0;
}
三、测试
0
请输入大于0的整数
-2
请输入大于0的整数
3
1 2 3
该链表的元素个数为:3
1 2 3
该链表的元素个数为:3
3 2 1
6
1 2 3 4 5 6
该链表的元素个数为:6
1 2 3 4 5 6
该链表的元素个数为:6
6 5 4 3 2 1
5
23 45
12 56 78
该链表的元素个数为:5
23 45 12 56 78
该链表的元素个数为:5
78 56 12 45 23
四、总结
注意结点间的逻辑关系,看不出来的话,画图分析最简单的例子,比如只有一个结点。