单链表反转有递归和非递归两种实现方法,

首先定义链表结点:

//定义一个链表节点
struct ListNode
{int value;ListNode *next;
};

一、递归方法

先反转后面的链表,从最后面的两个结点开始反转,依次向前,将后一个链表结点指向前一个结点,注意每次反转后要将原链表中前一个结点的指针域置空,表示将原链表中前一个结点指向后一个结点的指向关系断开。

二、非递归方法

利用两个结点指针和一个中间结点指针temp(用来记录当前结点的下一个节点的位置),分别指向当前结点和前一个结点,每次循环让当前结点的指针域指向前一个结点即可,翻转结束后,记得将最后一个节点的链域置为空。

整体测试程序:

#include<iostream>
using namespace std;//定义一个链表节点
struct ListNode
{int value;ListNode *next;
};//插入一个新节点到链表中(放在链表头部)
void CreateList(ListNode * & head, int data)
{//创建新节点ListNode * p = (ListNode*)malloc(sizeof(ListNode));p->value = data;p->next = NULL;if (head == NULL){head = p;return;}p->next = head;head = p;
}void  printList(ListNode* head)
{ListNode * p = head;while (p != NULL){cout << p->value<< " ";p = p->next;}cout << endl;
}//递归方式:实现单链表反转
ListNode * ReverseList(ListNode * head)
{//递归终止条件:找到链表最后一个结点if (head == NULL || head->next == NULL)return head;else{ListNode * newhead = ReverseList(head->next);//先反转后面的链表,从最后面的两个结点开始反转,依次向前head->next->next = head;//将后一个链表结点指向前一个结点head->next = NULL;//将原链表中前一个结点指向后一个结点的指向关系断开return newhead;}
}//非递归方式:实现单链表反转
ListNode* reverseList2(ListNode* head) {if (head == NULL || head->next == NULL) return head;ListNode* prev = head;ListNode* cur = head->next;ListNode* temp = head->next->next;while (cur){temp = cur->next; //temp作为中间节点,记录当前结点的下一个节点的位置cur->next = prev;  //当前结点指向前一个节点prev = cur;     //指针后移cur = temp;  //指针后移,处理下一个节点}head->next = NULL; //while结束后,将翻转后的最后一个节点(即翻转前的第一个结点head)的链域置为NULLreturn prev;
}int main()
{ListNode * head = NULL;for (int i = 0; i<9; i++)CreateList(head, i);printList(head);head = ReverseList(head);printList(head);system("pause");return 0;
}

经典算法——单链表反转的递归方法和非递归方法相关推荐

  1. 经典算法——单向链表反转

    1. 题目 单向链表反转是一道经典的求职面试笔试或机试题.给定如下如下链表的节点定义: struct LinkNode {int value;LinkNode* next; }; 比如有一个链表是这样 ...

  2. 单链表反转(递归和非递归)

    单链表反转有递归和非递归两种算法. 下面定义节点 [cpp] view plaincopy typedef struct ListNode{ int value; ListNode* next; }L ...

  3. 面试经典题-单链表反转

    struct node{node* next;T value; }; 方法一:常规方法 node* reverse(node*& head) {if ( (head == Null) || ( ...

  4. 算法----单链表反转

    思路 直接修改node 的 next 节点即可 代码 方法一: /*** Definition for singly-linked list.* public class ListNode {* in ...

  5. Interview:算法岗位面试—10.30上午上海某信息公司(偏图算法)技术面试之单链表反转、给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xcepti

    ML岗位面试:10.30上午上海某信息公司(偏图算法)技术面试之单链表反转.给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xception.推荐算法等 I ...

  6. 【算法系列之三】单链表反转

    问题: 实现单链表反转 答案: 链表准备 class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data ...

  7. Go语言-实现单链表反转算法

    Go语言实现链表的逆序_头插法 头插法与尾插法 头插法 概念 特点 核心过程 Go语言实现 ==注意==:上述方法是带头指针的头插法的实现,如果是带头节点的头插法需要做一定的修改 如果是带头节点的,则 ...

  8. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  9. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

最新文章

  1. Oracle笔记(3):数据库启动原理
  2. async和await结合读取文件
  3. 日常技术分享 : 一定要注意replcaceAll方法,有时候会如你所不愿!
  4. webpack-dev-server 搭建本地服务以及浏览器实时刷新
  5. 计算机一级报名照片是几寸的,一级建造师报名照片要几寸的
  6. MATLAB 读取图片像素处理
  7. cf一直连接服务器,玩穿越火线显示连接服务器超时怎么回事?原因分析及解决方法...
  8. 定位弹窗软件----找到真凶并做后续防御
  9. 3D游戏编程与设计-游戏分类与热点探索
  10. 阿里云RDS数据库设置
  11. 神经科学探索脑第二十二章
  12. 切比雪夫不等式的证明
  13. FileReader 文件操作
  14. 如何用手机访问本地页面?
  15. 黑马程序员---面向对象上(封装,继承,多态)
  16. AutoSAR系列讲解(实践篇)9.4-通信相关机制(下)
  17. 爬虫--西安二手房房价
  18. Python爬虫从入门到精通:(38)分布式爬虫_Python涛哥
  19. 使用ArcGIS绘制GTA 5 中洛圣都地图(可能是全网第一个)
  20. 解决PPT输入、删除卡顿现象(以Office2010为例)

热门文章

  1. 谷歌以及所有浏览器被篡改hao123
  2. C#最全最详细Nancy框架学习(常见报错,控制台应用,添加到现有ASP.Net MVC站点,ajax)
  3. ActionForward
  4. Lua语言之table表
  5. 网易公共技术Java面经
  6. 内存管理:物理地址、虚拟地址、逻辑地址
  7. 了解自己 做好自己
  8. 性能优化 - likely和unlikely函数
  9. 记录一次简单拿站过程(日记)
  10. 做外贸SOHO如何收汇