单链表的原地逆置—适用于O(1)空间复杂度

2023-11-16

单链表的原地逆置


一、代码

先放出代码:
【注】表尾指针 r 按需设置,在单链表的逆置过程中并不重要。

void ReverseList(LinkList &L) {
    LNode *r = L->next;      // 建立表尾指针,其实可以不要
    LNode *s = r->next;
    LNode *p = s->next;
    r->next = NULL;
    while (p) {              // 进入“头插法”循环
        s->next = L->next;
        L->next = s;
        s = p;
        p = s->next;
    }                        // 循环结束后,还存在最后一个节点没有插入
    s->next = L->next;       
    L->next = s;
}

二、分析

带头结点的4元素单链表 演示,先说明大致步骤:

① 建立指针 r, s, pr 指向“新表”(逆序后)的末尾结点;s 指向待插入的下一个结点;p 指向待插入结点的下一个结点。
② 进入循环。循环内使用 头插法。将 s, p 指针依次往后推移,利用头插法得到逆序的原理,插入头结点 L 之后。
【注】循环退出的条件,我是以 p 是否指向 NULL 来判定。当 p == NULL 时,s 还指向最后一个节点,因此需要在退出循环后再“头插”一次。

在这里插入图片描述

三、验证

写一段小代码进行验证:
【注】LinkList.h 结构体头文件:前文 单链表与双链表-线性表的链式表示 详解。

#include "LinkList.h"

void CreateList_TailInsert(LinkList &L) {
    L = (LNode*)malloc(sizeof(LNode));
    LNode *t, *r = L;          // 指针 r 一直指向链表 L 的尾部
    ElemType x;
    cin>>x;
    while (x!=9999) {
        t = (LNode*)malloc(sizeof(LNode));
        t->data = x;
        r->next = t;
        r = t;
        cin>>x;
    }
    r->next = NULL;            // 链表尾部之后为 NULL
}

void PrintList(LinkList L) {
    cout<<"output: ";
    while (L->next!=NULL) {
        L = L->next;
        cout<<L->data<<" ";
    }
    cout<<'\n'<<"----------------"<<'\n';
}

void ReverseList(LinkList &L) {
    LNode *r = L->next;      // 建立表尾指针,其实可以不要
    LNode *s = r->next;
    LNode *p = s->next;
    r->next = NULL;
    while (p) {              // 进入“头插法”循环
        s->next = L->next;
        L->next = s;
        s = p;
        p = s->next;
    }                        // 循环结束后,还存在最后一个节点没有插入
    s->next = L->next;       
    L->next = s;
}

int main() {
    LinkList L;
    cout<<"TailInsert: ";
    CreateList_TailInsert(L);  // 建表
    PrintList(L);
    ReverseList(L);            // 逆序
    PrintList(L);
    return 0;
}

运行结果如下:
在这里插入图片描述
更新时间——2023/3/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表的原地逆置—适用于O(1)空间复杂度 的相关文章

  • SignalR应用场景

    SignalR 是一个用于实时通信和即时通讯的开发库 它可以在多种应用场景中提供实时性能和功能 以下是一些适合使用 SignalR 的应用场景 即时聊天应用程序 SignalR 可以用于构建即时聊天应用程序 包括个人聊天 群组聊天和在线客服

随机推荐

  • 第 8 章 Jenkins – 设置Build Job

    通过下面的练习 在Jenkins创建一个job 并获取一个简单的HelloWorld应用程序 编译并运行这个Java程序 step 1 进入Jenkins控制面板然后点击 NewItem step 2 在这个页面 输入Item name 在
  • 小知识-pycharm的debug如何跳过for循环

    pycharm的debug如何跳过for循环
  • ATLAS 加入服务器未响应,路由器设置出现服务器未响应

    路由器设置出现服务器未响应 内容精选 换一换 两者主要有以下区别 一般操作系统的默认路由优先使用主网卡 如果出现使用扩展网卡导致网络不通现象通常是路由配置问题 默认主网卡具备与云公共服务区 PaaS DNS等服务所在区域 互通能力 扩展网卡
  • Apollo源码安装的问题及解决方法

    问题一 在进行git clone时 会报错Failed to connect to github com port 443 Timed out 经过实践后推荐以下两种方法 方法一 在原地址前加https ghproxy com 原地址 gi
  • 关于在VUE中使用html2canvas+jspdf方案将HTML页面导出为PDF遇到的坑

    首先网上有很多教程 我就简单记录下 主要是记录我遇到的问题 首先 npm install html2canvas jspdf s 然后在main js中引入 引入html转pdf的js import htmlToPdf from asset
  • hive中get_json_object函数

    原数据 表名 explode test 列名 sale info source 7fresh monthSales 4900 userCount 1900 score 9 9 source jdmart monthSales 7900 us
  • Spring Boot 2.6集成knife4j,解决Failed to start bean ‘documentationPluginsBootstrapper‘

    本次学习参考 官方文档 本次示例采用Spring Boot 2 6 3 完整的pom xml文件
  • 「通信原理」格雷码的生成与破译

    通信原理 格雷码的生成与破译 格雷码 gray code 相邻两数之间只有一个bit发生了改变 因此相比于自然编码的二进制系统 格雷编码的更不容易出错 使用卡诺图化简布尔代数式的时候 也会用到格雷码 本文将介绍三种格雷码的生成与破译方法 即
  • 现代密码学案例研究之索尼PS3破解

    ECDSA案例研究之索尼PS3被破解 背景介绍 ECDSA算法介绍 破解算法介绍 Reference 索尼因为PlayStation 3糟糕的加密实现而受到了黑客的破解 那么事情是怎么样的呢 设计了哪些密码学的算法呢 背景介绍 在2010年
  • STM32HAL库-针对芯片内部EEprom读写操作介绍

    目录 概述 一 使用方法 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32HAL库 操作芯片内部EEprom读写数据 类似操作Flash 可实现掉电保存数据功能 注 有些型号
  • CSS盒模型垂直居中的方式(前提已知宽高情况下)

    1 flex布局 box height 300px width 300px border 1px solid 000 margin 50px auto flex布局实现 display flex align items center jus
  • java串口通讯详解

    序言 说到开源 恐怕很少有人不挑大指称赞 学生通过开源代码学到了知识 程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程 商家通过开源软件赚到了钱 总之是皆大欢喜 然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例
  • 法兰克机械手手动操作_学习FANUC机器人编程设定,必懂这2个技巧!

    原标题 学习FANUC机器人编程设定 必懂这2个技巧 本文由成途机器人编程培训中心推荐 多年来 Fanuc工业机器人在全球机器人销量市场份额中一直处于无可撼动的地位 尤其是在汽车制造行业 在机器人编程培训学习中 不同品牌的工业机器人编程设定
  • 动态规划之01背包问题(最易理解的讲解)

    01背包问题 是用来介绍动态规划算法最经典的例子 网上关于01背包问题的讲解也很多 我写这篇文章力争做到用最简单的方式 最少的公式把01背包问题讲解透彻 01背包的状态转换方程 f i j Max f i 1 j Wi Pi j gt Wi
  • 使用Qt开发VxWorks应用程序

    使用Qt开发VxWorks应用程序 在嵌入式系统开发中 VxWorks是一款广泛使用的实时操作系统 而Qt则是一款跨平台的GUI开发框架 可以帮助开发者快速创建漂亮的用户界面和交互式应用程序 本文介绍如何使用Qt在VxWorks上开发应用程
  • IEEE latex会议模版中 通讯作者的标注不显示解决方法

    在模版备注里有一段说明 conference papers do not typically use thanks and this command is locked out in conference mode If really ne
  • construct2--仿超级马里奥platform游戏

    construct2作为一个简单的游戏制作工具 能为你们带来制作游戏的快乐 接下来我将讲述一下有关construct中platform游戏的制作 学习platform游戏的制作 我们就可以轻松的做出类似超级马里奥的游戏了 下面我将带来一个制
  • python3callable使用_Python callable()函数用法实例分析

    本文实例讲述了Python callable 函数用法 分享给大家供大家参考 具体如下 python中的内建函数callable 可以检查一个对象是否是可调用的 对于函数 方法 lambda 函数式 类 以及实现了 call 方法的类实例
  • AllenNLP框架学习笔记(数据篇之tokenizers)

    tokenizers是数据模块中的一个子模块 在里面主要包含了token与tokenizer的定义和使用 现在做一个简单的介绍 描述字符串是如何载入到TextFields中的 Token 简单的token抽象 其属性包括文本 偏移量 pos
  • 单链表的原地逆置—适用于O(1)空间复杂度

    单链表的原地逆置 一 代码 二 分析 三 验证 一 代码 先放出代码 注 表尾指针 r 按需设置 在单链表的逆置过程中并不重要 void ReverseList LinkList L LNode r L gt next 建立表尾指针 其实可