数据结构——线性表——链表反转
链表反转有两种常见方式。下面从图中详细解释。其中带有部分核心代码,最后上完整代码。
迭代法
//首先定义三个变量
PNODE pre = NULL;
PNODE now = pHead->pNext;
PNODE next = NULL;
next = now->pNext;//先保存下一个节点
now->pNext = pre;//当前节点的next指针指向前一个节点
pre = now;//前一个节点赋值为当前节点
now = next;//当前节点赋值为下一个节点
递归法
//一直递归直到找到尾节点
if(pHead == NULL || pHead->pNext == NULL)
return pHead;
pHead->pNext->pNext = pHead;//让当前节点的下一个节点的指针指向当前节点
pHead->pNext = NULL;//让当前节点的下一个节点指向NULL
再来一步
全部代码
/** *反转链表 **/ #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; typedef struct Node{ int data;//数据域 struct Node* pNext;//指针域 }NODE, *PNODE;//NODE等价于struct Node,PNODE等价于struct Node* //打印链表所有元素 void print_list(PNODE pHead) { pHead = pHead->pNext; while(pHead != NULL) { cout<<pHead->data<<" "; pHead = pHead->pNext; } cout<<endl; return; } //创建链表 PNODE create_list() { PNODE pHead = (PNODE)malloc(sizeof(NODE)); PNODE pNow = pHead; for(int i=1; i<=5; i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = i; pNow->pNext = pNew; pNow = pNew; } pNow->pNext = NULL; return pHead; } //迭代反转链表 void reverse_list(PNODE pHead) { //首先定义三个变量 PNODE pre = NULL; PNODE now = pHead->pNext; PNODE next = NULL; //反转 while(now != NULL) { next = now->pNext;//先保存下一个节点 now->pNext = pre;//当前节点的next指针指向前一个节点 pre = now;//前一个节点赋值为当前节点 now = next;//当前节点赋值为下一个节点 } //最后把头结点指向新生成链表的头 pHead->pNext = pre; return; } //递归反转链表 PNODE reverse_list2(PNODE pHead) { //一直递归直到找到尾节点 if(pHead == NULL || pHead->pNext == NULL) return pHead; PNODE pNew = reverse_list2(pHead->pNext);//返回的永远都是尾节点 pHead->pNext->pNext = pHead;//让当前节点的下一个节点的指针指向当前节点 pHead->pNext = NULL;//让当前节点的下一个节点指向NULL //返回的是原来链表的尾节点,也就是新链表的首节点 return pNew; } int main() { PNODE pHead = NULL; pHead = create_list(); print_list(pHead); cout<<"迭代反转链表之后"<<endl; reverse_list(pHead); print_list(pHead); cout<<"递归反转链表之后"<<endl; pHead->pNext = reverse_list2(pHead->pNext); print_list(pHead); return 0; }
分类:
【102】数据结构和算法[精选]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?