链表逆置

本文详细介绍了两种链表反转算法:一种是通过创建新链表进行反转,另一种是不通过创建新链表直接反转。同时提供了对应的C语言代码实现,包括初始化节点、打印链表、反转链表等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法一

首先想到的肯定是创建一个新的空链表,然后把旧的链表中的元素通过指针p从头到尾遍历,每遍历一个,就把该元素从链表中脱离,添加到新的链表的头部,新建空链表的时候可以初始化一个空的无用节点(仅仅是为了操作方便)。

算法二

不通过新建一个新链表,具体是让第一个节点的指针域为NULL,第二个指针域指向第一个节点,第三个指向第二个~~~~~~L指向最后一个节点。

下面是代码:

#include <stdio.h> #include <stdlib.h> typedef struct Node{ int data; struct Node *Next; }Node, *pNode; void InitialNode(pNode *node);//Intial Node void ReverseLink(pNode L);//reverse Link by creating a new link void PrintLink(pNode L);//print Link void ReverseLink2(pNode L);//reverse Link not by creating a new link int main() { Node Header; //define the first for no use Header.data = 0; Header.Next = NULL; pNode pTemp = &Header; for(int i = 0;i < 10; ++i) //initial Link,date is for debug { pNode pNew; InitialNode(&pNew); pNew->data = i; pTemp->Next = pNew; pTemp = pNew; } PrintLink(&Header); //ReverseLink(&Header);//opentional ReverseLink2(&Header); return 0; } void InitialNode(pNode *node) { *node = (pNode)calloc(1,sizeof(Node)); if(!*node) { printf("Error"); return ; } (*node)->data = 0; (*node)->Next = NULL; } void PrintLink(pNode L) { int i = 0; pNode p = L; while(p) { printf("node %d : %d\n",i,p->data); p = p->Next; } printf("\n\n"); } void ReverseLink(pNode L) { pNode q = NULL; pNode p = L; pNode pNewLink; InitialNode(&pNewLink); while(p) { q = pNewLink->Next; pNewLink->Next = p; p = p->Next; pNewLink->Next->Next = q; } printf("reverse Link 1 : \n"); PrintLink(pNewLink); } void ReverseLink2(pNode L) { pNode p = L; pNode r = NULL; pNode q = p->Next; while(q) { r = q->Next; q->Next = p; p = q; q = r; } L->Next = NULL; L = p; printf("reverse Link 2 : \n"); PrintLink(L); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值