当前位置: 首页 > article >正文

试编写算法将单链表就地逆置(默认是带头节 点,如果是不带头节点地逆置呢?)

编写一个算法来就地逆置一个单链表。默认情况下,链表是带头节点的,但如果链表不带头节点,逆置的过程会有所不同。

第一步:定义逆置函数

根据题目中的“试编写算法将单链表就地逆置”,我们需要:

  1. 定义一个逆置函数 reverse,它接受一个链表头节点的引用作为参数。

这部分的代码为:

void reverse(LNode*& L) {
    LNode *p = L->next, *r;
    L->next = NULL;

第二步:逆置链表

根据题目中的“就地逆置”,我们需要:

  1. 初始化 p 指向链表的第一个节点(跳过头节点)。
  2. 使用 while 循环遍历链表,直到 pNULL
  3. 在循环中,保存 p 的下一个节点到 r,然后将 pnext 指向头节点的下一个节点,最后更新头节点的 nextp

这部分的代码为:

    while (p != NULL) {
        r = p->next; // 保存下一个节点
        p->next = L->next; // 逆置当前节点
        L->next = p; // 更新头节点的next
        p = r; // 移动到下一个节点
    }
}

第三步:处理不带头节点的链表

如果链表不带头节点,我们需要稍微修改上述代码。在这种情况下,我们不需要头节点,可以直接操作原链表的头节点。

这部分的代码为:

void reverseNoHead(LNode*& L) {
    LNode *p = L, *r;
    L = NULL; // 新的头节点初始化为NULL
    while (p != NULL) {
        r = p->next; // 保存下一个节点
        p->next = L; // 逆置当前节点
        L = p; // 更新新的头节点
        p = r; // 移动到下一个节点
    }
}

完整代码

// 带头节点的逆置
void reverse(LNode*& L) {
    LNode *p = L->next, *r;
    L->next = NULL;
    while (p != NULL) {
        r = p->next;
        p->next = L->next;
        L->next = p;
        p = r;
    }
}

// 不带头节点的逆置
void reverseNoHead(LNode*& L) {
    LNode *p = L, *r;
    L = NULL;
    while (p != NULL) {
        r = p->next;
        p->next = L;
        L = p;
        p = r;
    }
}

代码过程

  1. 初始化 p 指向第一个节点,L->nextNULL
  2. while 循环中,r 保存 p 的下一个节点。
  3. p->next 指向 L->next,即前一个逆置后的节点。
  4. L->next 更新为 p,即当前逆置的节点。
  5. p 移动到 r,即下一个待逆置的节点。
  6. 重复步骤2-5,直到 pNULL

假设我们有一个单链表:1 -> 2 -> 3 -> 4,我们将通过表格来展示每一步的变化。

步骤L->nextprp->nextL->next 更新p 更新
初始22NULL3NULL3
1NULL23433
2334NULL24
324NULLNULL1NULL

在逆置过程中,我们首先将头节点的 next 指针设置为 NULL,然后遍历链表,每次将当前节点的 next 指针指向前一个逆置后的节点,然后将头节点的 next 指针更新为当前节点,最后将当前节点更新为其下一个节点。

最终,链表将被逆置为:4 -> 3 -> 2 -> 1。


http://www.kler.cn/a/388566.html

相关文章:

  • 【MySQL从入门到放弃】InnoDB磁盘结构(一)
  • 应对JSON解析键值对乱序问题的实用解决方案
  • ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?
  • ES6模块、CommonJS、AMD等不同的模块化实现。
  • Matlab实现鹈鹕优化算法(POA)求解路径规划问题
  • AI 大模型如何赋能电商行业,引领变革
  • Ubuntu24.04网络异常与应对方案记录
  • 【OH】openHarmony开发环境搭建(基于windows子系统WSL)
  • 在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码
  • 【kafka】大数据编写kafka命令使用脚本,轻巧简洁实用kafka
  • docker-compose 部署ntp时间同步服务(tmpfs例子)
  • 三菱MR-J4-B系列伺服参数一览
  • 第26天 安全开发-PHP应用模板引用Smarty渲染MVC模型数据联动RCE安全
  • 多线程编程中,使用 std::mutex 需要注意一些潜在的问题
  • 机器人开发:从零开始构建你的第一个机器人
  • 实验(未完成)
  • 43.第二阶段x86游戏实战2-提取游戏里面的lua
  • 宏观经济学笔记
  • PyQt5 详细安装与配置教程及使用
  • CSS的配色
  • 阿尔特曼:AGI 和 ASI 将在未来几千天内到来
  • 【SSL-RL】自监督强化学习:随机潜在演员评论家 (SLAC)算法
  • 几种QQuickWidget与Qml交互数据的方法
  • 深入理解 Git 及其工具的用途、使用方法与区别
  • 项目功能--会员数量折线图
  • 【计网不挂科】计算机网络期末考试(综合)——【选择题&填空题&判断题&简述题】完整试卷