经典算法——单链表反转的递归方法和非递归方法
单链表反转有递归和非递归两种实现方法,
首先定义链表结点:
//定义一个链表节点
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. 题目 单向链表反转是一道经典的求职面试笔试或机试题.给定如下如下链表的节点定义: struct LinkNode {int value;LinkNode* next; }; 比如有一个链表是这样 ...
- 单链表反转(递归和非递归)
单链表反转有递归和非递归两种算法. 下面定义节点 [cpp] view plaincopy typedef struct ListNode{ int value; ListNode* next; }L ...
- 面试经典题-单链表反转
struct node{node* next;T value; }; 方法一:常规方法 node* reverse(node*& head) {if ( (head == Null) || ( ...
- 算法----单链表反转
思路 直接修改node 的 next 节点即可 代码 方法一: /*** Definition for singly-linked list.* public class ListNode {* in ...
- Interview:算法岗位面试—10.30上午上海某信息公司(偏图算法)技术面试之单链表反转、给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xcepti
ML岗位面试:10.30上午上海某信息公司(偏图算法)技术面试之单链表反转.给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xception.推荐算法等 I ...
- 【算法系列之三】单链表反转
问题: 实现单链表反转 答案: 链表准备 class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data ...
- Go语言-实现单链表反转算法
Go语言实现链表的逆序_头插法 头插法与尾插法 头插法 概念 特点 核心过程 Go语言实现 ==注意==:上述方法是带头指针的头插法的实现,如果是带头节点的头插法需要做一定的修改 如果是带头节点的,则 ...
- 数据结构与算法--单链表相关面试题
此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...
- 单链表反转的原理和python代码实现
链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...
最新文章
- Oracle笔记(3):数据库启动原理
- async和await结合读取文件
- 日常技术分享 : 一定要注意replcaceAll方法,有时候会如你所不愿!
- webpack-dev-server 搭建本地服务以及浏览器实时刷新
- 计算机一级报名照片是几寸的,一级建造师报名照片要几寸的
- MATLAB 读取图片像素处理
- cf一直连接服务器,玩穿越火线显示连接服务器超时怎么回事?原因分析及解决方法...
- 定位弹窗软件----找到真凶并做后续防御
- 3D游戏编程与设计-游戏分类与热点探索
- 阿里云RDS数据库设置
- 神经科学探索脑第二十二章
- 切比雪夫不等式的证明
- FileReader 文件操作
- 如何用手机访问本地页面?
- 黑马程序员---面向对象上(封装,继承,多态)
- AutoSAR系列讲解(实践篇)9.4-通信相关机制(下)
- 爬虫--西安二手房房价
- Python爬虫从入门到精通:(38)分布式爬虫_Python涛哥
- 使用ArcGIS绘制GTA 5 中洛圣都地图(可能是全网第一个)
- 解决PPT输入、删除卡顿现象(以Office2010为例)