经典算法——单向链表反转
1. 题目
单向链表反转是一道经典的求职面试笔试或机试题。给定如下如下链表的节点定义:
struct LinkNode
{int value;LinkNode* next;
};
比如有一个链表是这样的,1->2->3->4->5,反转后成为 5->4->3->2->1。请实现函数
LinkNode* Reverse(LinkNode* header);
2. 迭代实现
2.1 分析
实现链表反转,我们需要从第二个节点开始遍历,将当前节点的 next 指向前一个节点。这里需要注意的是,该变当前节点的 next 时,需要提前保存 next,不然遍历就会中断。
时间复杂度 O(n);
空间复杂度 O(1)。
2.2 实现
//@brief: 迭代方式,实现单向链表反转
LinkNode* Reverse(LinkNode* header)
{if (header == NULL || header->next == NULL){return header;}LinkNode* pre = header, *cur = header->next;pre->next = NULL;while(cur != NULL){auto next = cur-> next;cur->next = pre;pre = cur;cur = next;}return pre;
}
2.3 验证
//
//@brief: main.cpp
//#include <iostream>
using namespace std;//@brief: 打印单向链表
void printLink(LinkNode* header)
{while(header != NULL){cout<< header->value;header = header->next;if (header != NULL){cout<< "->";}}cout<<endl;
}int main(int argc, char* argv[])
{//创建单向链接LinkNode* header = NULL, *cur = NULL;for(int i = 1; i <= 5; ++i) {LinkNode* node = new LinkNode;node->value = i;node->next = NULL;if (header == NULL){header = node;cur = header;}else{cur->next = node;cur = node;}}printLink(header);//反转单向链表auto newHeader = Reverse(header);printLink(newHeader);
}
编译执行输出:
g++ -std=c++11 main.cpp
./a.out
1->2->3->4->5
5->4->3->2->1
3. 递归实现
3.1 分析
从倒数第二个节点开始反转,依次向前,将后一个节点的 next 指向当前节点。注意每次反转后要将当前节点的 next 置空,表示断开当前节点与后一个节点的关联。此种方法可以使用递归来实现。
时间复杂度 O(n);
空间复杂度 O(n)。
由于每次递归都需要为实参分配空间,所以相较于非递归实现,较为耗费栈空间,且不易理解。
3.2 实现
//@brief: 递归方式,实现单链表反转
LinkNode * Reverse(LinkNode * head)
{//递归终止条件:找到链表最后一个结点if (head == NULL || head->next == NULL){return head;}LinkNode * newhead = ReverseList(head->next); //先递后归,从后往前遍历每个节点进行反转head->next->next = head; //将当前节点的后一个节点的 next 指向当前结点head->next = NULL; //断开当前节点指向后一个节点return newhead;
}
参考文献
[1] 经典算法——单链表反转的递归方法和非递归方法
经典算法——单向链表反转相关推荐
- 经典算法——单链表反转的递归方法和非递归方法
单链表反转有递归和非递归两种实现方法, 首先定义链表结点: //定义一个链表节点 struct ListNode {int value;ListNode *next; }; 一.递归方法 先反转后面的 ...
- 反转单向链表java_Java实现单向链表反转
本文实例为大家分享了Java实现单向链表反转的具体代码,供大家参考,具体内容如下 1.实现代码 public class LinkedListTest { public static void mai ...
- Java单向链表反转
要求 给出单链表的头节点 head ,要求反转链表,并返回反转后的链表. 实现原理 单向链表反转就是将链表的指针方向改变.由于单链表没有指向前一个结点的指针,所以,我们定义一个指向前一个节点的指针pr ...
- 单向链表反转(倒置)问题
今天遇到单向链表的反转的问题,于是静下心来好好想了一番. 解题思路如下图: 假设当前创建好的链表如下: 首先让头节点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个 ...
- 单向链表反转(逆置)
参考 #include <iostream> using namespace std;class List { public://节点结构struct Node{int data;Node ...
- 数据结构与算法-单向链表的修改和删除操作
单向链表的修改和删除操作 单向链表的修改 单向链表的删除 单向链表的修改 在上面的代码基础上定义几个英雄 HeroNode hero1 = new HeroNode(1,"宋江", ...
- 算法学习 —— 链表反转
链表反转 链表反转的步骤(方法一): 定义一个新的节点 newNode 遍历需要反转的链表 node,遍历的同时进行反转,首先获得节点 newNode的下一个节点(保存于 newNodeNext),接 ...
- 算法详解——单向链表反转
一.问题描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 二.分析问题 1.递归法 首先来考虑两个节点的基本情况,假设链表head有两个节点,只需要让head->n ...
- 反转链表JAVA算法_链表反转算法
1 packagecom.trs.codetool.sort;2 3 /** 4 *@authorzheng.changgang5 * @date 2020-01-02 09:576 * 链表的常见算 ...
最新文章
- 基于 OpenCV 的图像分割项目实战
- adams2015安装教程
- 也记一次性能优化:LINQ to SQL中Contains方法的优化
- jquery控制css的display(控制元素的显示与隐藏)
- MATLAB(六)数据处理
- 深入Spring Boot:利用Arthas排查NoSuchMethodError
- IO流,字节流文件拷贝示例 [FileInputStream FileOutputStream]
- 插入行政区划编码的sql代码
- 电力用户用电信息采集系统通信协议报文解析示例
- 制造商朝DOE LED功效目标迈进稳步前进
- Java学习记录之StringBuilder类
- STM32连接WIFI-ESP8266获取天气信息---STA模式运用
- 【愚公系列】2022年09月 微信小程序-WebGL立体图形的绘制
- html5 css3制作柱形图,一步一步教你实现纯CSS的柱形图
- 如何不花钱也能下载17sucai网的网页或者单页
- jquery操作表格 合并单元格
- 18届大专实习生2020总结
- 历经艰辛,新买的kingmax 8G超棒(SM325)量产成功,速度飙升一倍
- 戴尔 PowerEdge 14G 加速分布式存储解决方案 zData 提升性能
- 半导体行业十万级净化车间尘埃粒子监测
热门文章
- 多个高危漏洞可导致 Chrome 浏览器被黑
- 英特尔开源计算机视觉数据标签工具CVAT,加速数据注释
- springcloud微服务系列之服务注册与发现组件Eureka
- Sersync实时备份服务部署实践
- android四大组件小整
- Java发令枪ConcurrentExecutor之控制线程数,并发数
- 【数据库原理】滨江学院姜青山 期末试卷知识点笔记整理 南京信息工程大学
- linux udp广播转发到所有ip,linux – 所有接口上的UDP广播
- pythonwindow程序窗体操作_python操作Windows窗口程序
- Oracle客户端安装以及PL/SQL Developer安装方法