假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相同的后缀存储空间,例如,“loading”,“being”的存储映像如下图所示。

在这里插入图片描述
假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相同的后缀存储空间,例如,“loading”,“being”的存储映像如下图所示。
设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为
data next
请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)

算法思想:

1.遍历两个单链表,分别计算出它们的长度。
2.如果两个链表的长度不相同,则将较长的那个链表的头指针往后移,使得两个链表剩余的长度相同。
3.同时遍历两个链表,比较节点是否相同,直至找到第一个相同的节点或遍历到链表的结尾。
4.输出或返回第一个相同节点的位置。

代码:(完整理解此题)

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    char data;
    struct ListNode* next;
};

struct ListNode* findCommonSuffix(struct ListNode* str1, struct ListNode* str2) {
    int len1 = getListLength(str1);
    int len2 = getListLength(str2);

    // 将较长链表的头指针向后移动,使得两个链表剩余的长度相等
    if (len1 > len2) {
        str1 = moveHead(str1, len1 - len2);
    } else if (len2 > len1) {
        str2 = moveHead(str2, len2 - len1);
    }

    // 同时遍历两个链表,比较节点是否相同
    while (str1 != NULL && str2 != NULL) {
        if (str1 == str2) {
            return str1; // 找到第一个相同的节点
        }
        str1 = str1->next;
        str2 = str2->next;
    }

    return NULL; // 没有找到共同后缀
}

// 获取链表的长度
int getListLength(struct ListNode* head) {
    int length = 0;
    while (head != NULL) {
        length++;
        head = head->next;
    }
    return length;
}

// 将链表的头指针向后移动指定步数
struct ListNode* moveHead(struct ListNode* head, int steps) {
    for (int i = 0; i < steps; i++) {
        head = head->next;
    }
    return head;
}

int main() {
    // 构建示例链表
    struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node1->data = 'l';
    node1->next = NULL;
    struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node2->data = 'o';
    node2->next = NULL;
    struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node3->data = 'a';
    node3->next = NULL;
    struct ListNode* node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node4->data = 'd';
    node4->next = NULL;
    struct ListNode* node5 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node5->data = 'i';
    node5->next = NULL;
    struct ListNode* node6 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node6->data = 'n';
    node6->next = NULL;
    struct ListNode* node7 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node7->data = 'g';
    node7->next = NULL;

    // 构建链表结构
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;
    node5->next = node6;
    node6->next = node7;

    struct ListNode* str1 = node1;

    // 构建示例链表
    struct ListNode* node8 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node8->data = 'b';
    node8->next = NULL;
    struct ListNode* node9 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node9->data = 'e';
    node9->next = NULL;
    struct ListNode* node10 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node10->data = 'i';
    node10->next = NULL;
    struct ListNode* node11 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node11->data = 'n';
    node11->next = NULL;
    struct ListNode* node12 = (struct ListNode*)malloc(sizeof(struct ListNode));
    node12->data = 'g';
    node12->next = NULL;

    // 构建链表结构
    node8->next = node9;
    node9->next = node10;
    node10->next = node11;
    node11->next = node12;

    struct ListNode* str2 = node8;

    // 调用函数查找共同后缀
    struct ListNode* commonSuffix = findCommonSuffix(str1, str2);

    if (commonSuffix != NULL) {
        printf("共同后缀的起始位置为:%c\n", commonSuffix->data);
    } else {
        printf("未找到共同后缀\n");
    }

    // 释放内存
    free(node1);
    free(node2);
    free(node3);
    free(node4);
    free(node5);
    free(node6);
    free(node7);
    free(node8);
    free(node9);
    free(node10);
    free(node11);
    free(node12);

    return 0;
}

{
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/195752.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、如何实现跨域?二、TCP 为什么要三次握手,两次不行吗?为什么?三、说一下 TCP 粘包是怎么产生的?怎么解决粘包问题的?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

【Cisco Packet Tracer】构造超网

​​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Cisco Packet Tracer | 奇遇记》⏰寄 语&#xff1a;风翻云浪激&#xff0c;剑舞星河寂。 临风豪情壮志在&#xff0c;拨云见日昂首立。 目录 ⛳️1. Cisco Packet Trace…

猫头虎分享已解决Bug || Error: Minified React error #130

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

QT 界面切换

先新建一个Widget工程 ui界面设置如下 在添加一个QT设计师界面类 右键点击添加 第二个UI界面设置如下 代码 链接&#xff1a;https://pan.baidu.com/s/1ovDIG2pno9mJ7mMFh2tq3Q 提取码&#xff1a;6q3m –来自百度网盘超级会员V2的分享

E云管家开发个微自动添加好友

简要描述&#xff1a; 添加微信好友 请求URL&#xff1a; http://域名地址/addUser 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId…

【论文解读】基于生成式面部先验的真实世界盲脸修复

论文地址&#xff1a;https://arxiv.org/pdf/2101.04061.pdf 代码地址&#xff1a;https://github.com/TencentARC/GFPGAN 图片解释&#xff1a; 与最先进的面部修复方法的比较&#xff1a;HiFaceGAN [67]、DFDNet [44]、Wan 等人。[61] 和 PULSE [52] 在真实世界的低质量图像…

贪吃蛇小游戏基本简单布局

代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Layui贪吃蛇小游戏</title> <link rel"stylesheet" href"https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/css/layui.…

【Intel FPGA】D5005 使用笔记

项目总目标&#xff0c;在AFU中实现xx算法DDR 1.FPGA device &#xff1a;1SX280HN2F43E2VG 2 .硬件架构图 3.DDR信息 4.FIM &#xff08;FPAG Interface Manager&#xff09; The FIM contains the FPGA logic to support the accelerators, including the PCIe IP core, …

【解决视觉引导多个位置需要标定多个位置的问题】

** 以下只针对2D定位&#xff0c;就是只有X、Y、Rz三个自由度的情况。** 假设一种情况&#xff0c;当视觉给机器人做引导任务时&#xff0c;零件有多个&#xff0c;分布在料框里&#xff0c;视觉需要走多个位置去拍&#xff0c;那么只需要对第一个位置确定拍照位&#xff0c;确…

【Flutter】graphic图表的快速上手

简介 graphic是一个数据可视化语法和Flutter图表库。 官方github示例 网上可用资源很少,只有作者的几篇文章,并且没有特别详细的文档,使用的话还是需要一定的时间去调研,在此简单记录。 示例 以折线图为例(因为我只用到了折线图,但其他的图大差不差) 创建一个两个文…

运行时错误/缺陷到底是什么缺陷

运行时错误(Run-time Error)是一种跟程序运行状态相关的缺陷。这类缺陷不能通过直接禁用相关特性来屏蔽&#xff0c;而是需要通过分析变量的数值状态来发现可能的异常。简单来说&#xff0c;这些缺陷通常只有当程序执行起来以后&#xff0c;才能逐渐暴露出的缺陷&#xff0c;一…

Buzz库python代码示例

Buzz库来编写一个下载器程序。 php <?php require_once vendor/autoload.php; // 引入Buzz库 use Buzz\Browser; use Buzz\Message\Response; $browser new Browser(); // 设置 $browser->setHttpClient(new HttpClientProxy([ host > , port > , ])…

企业员工为什么不喜欢使用MES管理系统

随着科技的进步和数字化转型的趋势&#xff0c;越来越多的企业开始引入MES管理系统解决方案以提升生产效率和质量。然而&#xff0c;尽管MES管理系统的潜在优势众所周知&#xff0c;但其在企业内部的推广和应用却常常面临员工的抵触和反感。本文将从多个角度探讨企业员工为什么…

DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题解决方式

更新时间&#xff1a;2023年10月31日 11:37:53 作者&#xff1a;产品人小柒 dbeaver数据库连接工具,可以支持几乎所有的主流数据库.mysql,oracle.sqlserver,db2 等等,这篇文章主要给大家介绍了关于DBeaver连接MySQL提示"Public Key Retrieval is not allowed"问…

IDEA删除的文件怎么找回更新

一、 查找本地历史记录IDEA在进行代码版本管理时&#xff0c;会自动创建本地历史记录&#xff0c;如果我们误删了文件&#xff0c;可以通过查找本地历史记录来找回文件。 1.在项目中&#xff0c;选中被删文件的父级目录&#xff0c;“File”->“Local History”->“Show…

『VUE3后台—大事件管理系统』

项目地址&#xff1a;https://gitee.com/csheng-gitee/vue3-big-event-admin 技术栈&#xff1a;VUE3 Pinia Pnpm&#xff08;本项目暂不用 typescript&#xff09; 一、前期准备工作 1、创建项目 npm install -g pnpm pnpm create vue2、ESLint 配置 (1) 禁用 prettier 插…

java第二十章总结多线程

20.2创建线程 20.2.1继承Thread类 Thread类是Java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建议Thread实例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1让线程…

C语言--根据成绩判断等级

一.题目描述 如果学生的成绩小于60分&#xff0c;那么输出不及格 如果学生的成绩大于60分小于85分&#xff0c;那么输出良好 如果学生的成绩大于85分&#xff0c;那么输出优秀 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //根据成绩打印等级 //scor…

06-学成在线添加课程,包含课程基本信息,营销信息,课程计划信息,师资信息

添加课程基本/营销/计划信息 界面原型 第一步: 用户进入课程查询列表,点击添加课程按钮,选择课程类型是直播还是录播,课程类型不同那么授课方式也不同 添加的课程和教学机构是一对一的关系 第二步: 用户选完课程形式后,点击下一步填写课程的基本信息和营销信息(两张表) 用户…

在Visual Studio Code中安装加速TypeScript程序开发的插件

在Visual Studio Code中安装加速TypeScript程序开发的插件 Install Extensions on Visual Studio Code for TypeScript Application Development By Jackson 2023-11-28 众所周知&#xff0c;微软的Visual Studio Code是一款轻量级、功能强大的集成开发环境。它支持各种编程语…
最新文章