算法概述:要求实现将一条单向链表反转并考虑时间复杂度。

算法分析:

数组法(略):

  将列表元素逐个保存进数组,之后再逆向重建列表

  点评:实现逻辑最简单,需要额外的内存开销。

移动指针:

  通过三个指针逐个从链表头开始逐一反转链表元素的指针

  点评:不需要额外的内存开销,会改变原始链表。

递归:

  以递归的方式首先找到链表尾部,再逐一反转指针

  点评:不需要额外的内存开销,不会改变原始链表。

算法实现:

构建链表结构

/* 节点结构 */
struct NODE
{
int data;
struct NODE* next;
}; /* 添加元素-压栈 */
void push(NODE** head, int dat) {
struct NODE* new_node = new NODE();
new_node->data = dat;
new_node->next = *head;
*head = new_node;
} /* 添加元素-添加 */
void add(NODE** head, int dat) {
struct NODE* new_node = new NODE();
new_node->data = dat;
new_node->next = NULL;
if (*head != NULL) {
struct NODE* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
else {
*head = new_node;
}
}

移动指针

/* 反转列表 */
void reverse(NODE** head) {
struct NODE* pre = NULL;
struct NODE* cur = *head;
struct NODE* nxt;
while (cur != NULL) {
// 反转指针
nxt = cur->next;
cur->next = pre;
// 移动指针
pre = cur;
cur = nxt;
}
*head = pre;
}

递归

/* 反转列表-复制原表返回反转表 */
NODE* reverse(NODE* head) {
if (head == NULL || head->next == NULL) {
return head;
}
NODE* new_head = reverse(head->next);
// 反转指针
head->next->next = head;
head->next = NULL;
return new_head;
}

打印链表

/* 打印队列 */
void print(NODE* head) {
NODE* temp = head;
while (temp != NULL) {
std::cout << temp->data << std::endl;
temp = temp->next;
}
}

>>完整代码

数据结构与算法(c++)——反转链表的更多相关文章

  1. 2、java数据结构和算法:单链表: 反转,逆序打印, 合并二个有序链表,获取倒数第n个节点, 链表的有序插入

    什么也不说, 直接上代码: 功能点有: 1, 获取尾结点 2, 添加(添加节点到链表的最后面) 3, 添加(根据节点的no(排名)的大小, 有序添加) 4, 单向链表的 遍历 5, 链表的长度 6, ...

  2. java数据结构和算法04(链表)

    前面我们看了数组,栈和队列,大概就会这些数据结构有了一些基本的认识,首先回顾一下之前的东西: 在数组中,其实是分为有序数组和无序数组,我简单实现了无序数组,为什么呢?因为有序数组的实现就是将无序数组进 ...

  3. Android版数据结构与算法(三):基于链表的实现LinkedList源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. LinkedList 是一个双向链表.它可以被当作堆栈.队列或双端队列进行操作.LinkedList相对于ArrayList来说,添加,删除元素效 ...

  4. 数据结构与算法JavaScript描述——链表

    1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要 ...

  5. 数据结构和算法之单向链表二:获取倒数第K个节点

    我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...

  6. 【数据结构与算法】单链表操作(C++)

    #include <stdio.h> #include <malloc.h> /*单链表节点定义*/ typedef struct LNode { int data; //da ...

  7. 数据结构与算法JavaScript (三) 链表

    我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言 ...

  8. Java数据结构与算法(5) - ch05链表(LinkList)

    双端链表与传统链表非常相似,但是它有一个新增的特性:即对最后一个链节点的引用,就像对第一个连接点的引用一样.注意与双向链表进行区别.

  9. C:数据结构与算法之单链表

    单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结 ...

随机推荐

  1. 通过pyenv和virtualenv创建多版本Python虚拟环境

    虚拟环境使用第三方工具virtualenv创建,首先输入以下命令检查系统是否已经安装virtualenv. $ virtualenv --version 如果显示virtualenv版本号,则说明已经 ...

  2. 基础环境之Docker入门

    随着Docker技术的不断成熟,越来越多的企业开始考虑使用Docker.Docker有很多的优势,本文主要讲述了Docker的五个最重要优势,即持续集成.版本控制.可移植性.隔离性和安全性. 有了Do ...

  3. arm swi 软中断 一例

    原文在CU,挪过来了. 1. 目标 本文单纯验证swi指令相关功能 2. 环境 vmware + redhat 9 + arm-elf-gcc 2.95 + skyeye-1.2.6_rc1(模拟s3 ...

  4. C#中yield的使用

    yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值, ...

  5. python之 模块与包

    一. 模块 1.模块定义: 将代码量较大的程序分割成多个有组织的.彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块. 2.模块分类: a.标准库(又称内置模块) b.开源模块(又 ...

  6. flask配置管理

    配置管理 复杂的项目需要配置各种配置环境,如果设置项缺少可以直接硬编码进来,比如下面的方式: app.config['DEBUG']=True app.config['SECRET_KEY'] = ' ...

  7. [转]Linux里的2>&1究竟是什么

    我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令. 首先我们把这条命令大概分解下首先就是一个nohup表示当前用户和系 ...

  8. c#中常用集合类和集合接口之集合类系列【转】

    常用集合接口系列:http://www.cnblogs.com/fengxiaojiu/p/7997704.html 常用集合类系列:http://www.cnblogs.com/fengxiaoji ...

  9. MongoDB(一)环境搭建与初始配置

    前言 最近的项目中需要用到MongoDB,所这段时间需要学习知道怎么去使用这个数据库. 这里我先简单的介绍一下什么是MongoDB,后面还会详细的介绍: MongoDB 是一个面向文档的通用型数据库, ...

  10. 【Java学习笔记之三】java中的变量和常量

    变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 在实际的程序中,可以根据 ...