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] 经典算法——单链表反转的递归方法和非递归方法

经典算法——单向链表反转相关推荐

  1. 经典算法——单链表反转的递归方法和非递归方法

    单链表反转有递归和非递归两种实现方法, 首先定义链表结点: //定义一个链表节点 struct ListNode {int value;ListNode *next; }; 一.递归方法 先反转后面的 ...

  2. 反转单向链表java_Java实现单向链表反转

    本文实例为大家分享了Java实现单向链表反转的具体代码,供大家参考,具体内容如下 1.实现代码 public class LinkedListTest { public static void mai ...

  3. Java单向链表反转

    要求 给出单链表的头节点 head ,要求反转链表,并返回反转后的链表. 实现原理 单向链表反转就是将链表的指针方向改变.由于单链表没有指向前一个结点的指针,所以,我们定义一个指向前一个节点的指针pr ...

  4. 单向链表反转(倒置)问题

    今天遇到单向链表的反转的问题,于是静下心来好好想了一番. 解题思路如下图: 假设当前创建好的链表如下: 首先让头节点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个 ...

  5. 单向链表反转(逆置)

    参考 #include <iostream> using namespace std;class List { public://节点结构struct Node{int data;Node ...

  6. 数据结构与算法-单向链表的修改和删除操作

    单向链表的修改和删除操作 单向链表的修改 单向链表的删除 单向链表的修改 在上面的代码基础上定义几个英雄 HeroNode hero1 = new HeroNode(1,"宋江", ...

  7. 算法学习 —— 链表反转

    链表反转 链表反转的步骤(方法一): 定义一个新的节点 newNode 遍历需要反转的链表 node,遍历的同时进行反转,首先获得节点 newNode的下一个节点(保存于 newNodeNext),接 ...

  8. 算法详解——单向链表反转

    一.问题描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 二.分析问题 1.递归法 首先来考虑两个节点的基本情况,假设链表head有两个节点,只需要让head->n ...

  9. 反转链表JAVA算法_链表反转算法

    1 packagecom.trs.codetool.sort;2 3 /** 4 *@authorzheng.changgang5 * @date 2020-01-02 09:576 * 链表的常见算 ...

最新文章

  1. 基于 OpenCV 的图像分割项目实战
  2. adams2015安装教程
  3. 也记一次性能优化:LINQ to SQL中Contains方法的优化
  4. jquery控制css的display(控制元素的显示与隐藏)
  5. MATLAB(六)数据处理
  6. 深入Spring Boot:利用Arthas排查NoSuchMethodError
  7. IO流,字节流文件拷贝示例 [FileInputStream FileOutputStream]
  8. 插入行政区划编码的sql代码
  9. 电力用户用电信息采集系统通信协议报文解析示例
  10. 制造商朝DOE LED功效目标迈进稳步前进
  11. Java学习记录之StringBuilder类
  12. STM32连接WIFI-ESP8266获取天气信息---STA模式运用
  13. 【愚公系列】2022年09月 微信小程序-WebGL立体图形的绘制
  14. html5 css3制作柱形图,一步一步教你实现纯CSS的柱形图
  15. 如何不花钱也能下载17sucai网的网页或者单页
  16. jquery操作表格 合并单元格
  17. 18届大专实习生2020总结
  18. 历经艰辛,新买的kingmax 8G超棒(SM325)量产成功,速度飙升一倍
  19. 戴尔 PowerEdge 14G 加速分布式存储解决方案 zData 提升性能
  20. 半导体行业十万级净化车间尘埃粒子监测

热门文章

  1. 多个高危漏洞可导致 Chrome 浏览器被黑
  2. 英特尔开源计算机视觉数据标签工具CVAT,加速数据注释
  3. springcloud微服务系列之服务注册与发现组件Eureka
  4. Sersync实时备份服务部署实践
  5. android四大组件小整
  6. Java发令枪ConcurrentExecutor之控制线程数,并发数
  7. 【数据库原理】滨江学院姜青山 期末试卷知识点笔记整理 南京信息工程大学
  8. linux udp广播转发到所有ip,linux – 所有接口上的UDP广播
  9. pythonwindow程序窗体操作_python操作Windows窗口程序
  10. Oracle客户端安装以及PL/SQL Developer安装方法