数据结构代码集训day10(适合考研、自学、期末和专升本)

news2024/9/21 12:42:51

习题均来自B站up:白话拆解数据结构


题目如下:

(1)求两个链表的交集并存在第一个表中,注意俩链表是递增的且表示的是集合;

(2)【408真题】假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data 域的值,并返回 1;否则,只返回 0。要求:
⑴ 描述算法的基本设计思想;
⑵ 描述算法的详细实现步骤;
⑶ 根据设计思想和实现步骤,采用程序设计语言描述算法(使用 C、C++或 Java 语言实现),关键之处请给出简要注释。


题1

        注意,这里的链表加了限制条件,有序,表示的是集合,集合说明着每个链表中无重复元素,这样就好做多了。

        我们先定义一堆指针,先拿出两个指向a表和b表的第一个结点,当p指针不为空时进入循环,固定第一个链表,让第一个链表和第二个链表的每一个结点相比,看看是否有重复,有重复我们就用flag记录,找到了表尾还没有重复就说明不是交集,删掉a表中的这个元素即可!然后进入下一轮循环 。      

void jiaoji(Linklist &A,Linklist B){

    Lnode *p,*q,*s,*t;

    p=A->next;

    q=B->next;

    s=A;        // 辅助指针,指向新表中的最后一个结点

   

    while(p){

        q=B->next;        // q指针每次都要从第一个结点开始和a表比

        bool flag=false;

        while(q){

            if(p->data==q->data){   // 找到交集了

                s->next=p;

                s=p;

                flag=true;

                break;

            }

            q=q->next;

        }

        if (!flag) {    //q走完一圈没发现有交集

            t = p->next;

            delete p;

            p = t;

        } else {

            p = p->next;  // 正常前进到下一个节点,就是flag为true的情况

        }

    }

    s->next=NULL;        // 置空表示这是表尾

}

         演示一下:成功

完整代码如下:

#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

// 单链表结构体定义
typedef struct Lnode{
    int data;
    Lnode *next;
}Lnode,*Linklist;

Linklist list_insertbytail(Linklist &L){
    Lnode *s;
    int x;
    L = (Lnode*)malloc(sizeof(Lnode));
    L->next = NULL;
    Lnode *r = L;
    cin >> x;
    while(x!=9999){
        s = (Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        s->next=NULL;

        r->next = s;
        r=r->next;
        cin >> x;
    }
    return L;
}

// 求两个链表的交集存在a表中,注意俩链表是递增的且表示集合
void jiaoji(Linklist &A,Linklist B){
    Lnode *p,*q,*s,*t;
    p=A->next;
    q=B->next;
    s=A;
   
    while(p){
        q=B->next;
        bool flag=false;
        while(q){
            if(p->data==q->data){   // 找到交集了
                s->next=p;
                s=p;
                flag=true;
                break;
            }
            q=q->next;
        }
        if (!flag) {    //q走完一圈没发现有交集
            t = p->next;
            delete p;
            p = t;
        } else {
            p = p->next;  // 正常前进到下一个节点,就是flag为true的情况
        }
    }
    s->next=NULL;
}

int main(){
    Linklist A,B;
    list_insertbytail(A);
    list_insertbytail(B);

    Lnode *p = A->next;
    printf("origin list:");
    while (p != NULL) {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");

    Lnode *q= B->next;
    printf("origin list:");
    while (q != NULL) {
        printf("%d ",q->data);
        q = q->next;
    }
    printf("\n");
    
    jiaoji(A,B);
    printf("new L1:");

    Lnode *s = A->next;
    while (s != NULL) {
        printf("%d-> ",s->data);
        s = s->next;
    }
    printf("NULL");

    return 0;
}

题2

        这个题就比较有意思了,第一次我只想到了暴力的方法,果然算法到最后尽是数学!

        假如这是一个长度为n的链表(偷懒画成了顺序表),p和q分别指向表头。

        我们先让p走k步,目的是为了让p和q相差k个单位,剩下表长为n-k

        此时我们让p和q一起移动,到表尾停止,注意p和q一直相差k个单位

        仔细看图,p指针是不是继续走了n-k步啊,由于p和q一直相差k步,所以q的位置就是倒数第k个位置,是不是很神奇?

代码如下:

int fink_k(Linklist &list,int k){

    Lnode *p,*q;

    p=list;

    q=list;

    int count=0;    // 计数器

    for(;count<k;count++,p=p->next);    // 先走k步

    while(p){   // 再一起走n-k步

        q=q->next;

        p=p->next;

    }

    printf("the k value is:");

    printf("%d\n",q->data); // q最后就在n-k这个结点的位置

    return 1;

}

        实操:找倒数第三个位置的元素,成功!

完整代码如下:

#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

// 单链表结构体定义
typedef struct Lnode{
    int data;
    Lnode *next;
}Lnode,*Linklist;

Linklist list_insertbytail(Linklist &L){
    Lnode *s;
    int x;
    L = (Lnode*)malloc(sizeof(Lnode));
    L->next = NULL;
    Lnode *r = L;
    cin >> x;
    while(x!=9999){
        s = (Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        s->next=NULL;

        r->next = s;
        r=r->next;
        cin >> x;
    }
    return L;
}

// 查找链表倒数第k个位置上的结点,输出这个结点的值,并返回1
int fink_k(Linklist &list,int k){
    Lnode *p,*q;
    p=list;
    q=list;
    int count=0;    // 计数器
    for(;count<k;count++,p=p->next);    // 先走k步
    while(p){   // 再一起走n-k步
        q=q->next;
        p=p->next;
    }
    printf("the k value is:");
    printf("%d\n",q->data); // q最后就在n-k这个结点的位置
    return 1;
}

int main(){
    Linklist list;
    list_insertbytail(list);

    Lnode *p = list->next;
    printf("origin list:");
    while (p != NULL) {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");

    int b=fink_k(list,3);
    if(b==1)
        printf("success find");
    else printf("you are loser");
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第389题找不同

题目&#xff1a; 题解&#xff1a; char findTheDifference(char* s, char* t) {int n strlen(s), m strlen(t);int ret 0;for (int i 0; i < n; i) {ret ^ s[i];}for (int i 0; i < m; i) {ret ^ t[i];}return ret; }

自己动手写CPU_step6_算术运算指令

序 接上篇&#xff0c;本篇开始实现算数运算指令&#xff0c;包括加减乘除&#xff0c;加减比较好实现&#xff0c;乘除则需要考虑指令周期与其他指令的周期长度不一致问题&#xff0c;可能会导致流水线效率下降&#xff0c;本篇先实现简单的算术运算。 指令定义 define EXE_AD…

java epoll网络编程

java epoll网络编程 从通信开始 人类社会的发展离不开相互协作&#xff0c;一起围猎、抵御野兽&#xff0c;一起扛起锄头夯地、夯人&#xff0c;再到你与好兄弟之间征战峡谷。在这一切互相协作的背后&#xff0c;都离不开信息的传递&#xff0c;也就是通信。一群人聚在一起&am…

Android学习笔记(一) Android Studio 安装配置

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 Android Studio 的安装配置 1、基本介绍 Android Studio 是 Google 推出的 Android 集成开发环境&#xff0c;可以用于创建、开发和调试 Android 项目 Android Studio 是基于 IntelliJ IDEA 开发的 &#xff0c;提供了专…

typora的一些配置方法

1.设置图片的保存路径 选择 文件 --> 偏好设置 --> 图像 --> 设置图片要保存的位置 将网络的图片保存到本地&#xff0c;例如&#xff0c;从csdn复制文章时&#xff0c;将文章中的图片自动保存到本地 在图像设置的插入图片时一栏&#xff0c;勾选对网络位置的图片应…

vmware中克隆过来的linux节点无system eth0

问题现象 使用vmware虚拟机的克隆功能后&#xff0c;找不到system eth0 解决办法 编辑/etc/udev/rules.d/70-persistent-net.rules文件 可以看到&#xff0c;eth0&#xff0c;是克隆前机器的网卡&#xff0c;eth1是克隆后机器生成的网卡&#xff0c;所以把NAME"eth0&q…

解决方案:在autodl环境下安装torch被killed掉

文章目录 一、现象二、解决方案 一、现象 平台&#xff1a;autodl 镜像&#xff1a;PyTorch 2.0.0 Python 3.8(ubuntu20.04) Cuda 11.8 GPU&#xff1a;A40(48GB) * 1 CPU&#xff1a;15 vCPU AMD EPYC 7543 32-Core Processor 内存&#xff1a;80GB 安装torch:1.13.0环境&a…

基于CloudflareSpeedTest项目实现git clone加速

1.网络测速 「自选优选 IP」测试 Cloudflare CDN 延迟和速度&#xff0c;获取最快 IP 更多内容参考项目&#xff1a;https://github.com/XIU2/CloudflareSpeedTest 国外很多网站都在使用 Cloudflare CDN&#xff0c;但分配给中国内地访客的 IP 并不友好&#xff08;延迟高、丢…

串口助手使用和插入usb转TTL的COM口识别问题

问题出现原因 由于串口调试中经常需要通过断电对单片机烧录程序&#xff0c;所以制作了一个转接带开关的USB 转接口&#xff0c;如下图所示&#xff0c;其中按键控制的是OUT口的电源通断。但为了能够数据传输&#xff0c;有两根传输数据的线是一直连接的。在使用usb进行程序烧…

【Threejs学习】创建Threejs页面

学习文档地址&#xff1a; threejs官网&#xff1a;https://threejs.org/ Threejs官网中文文档&#xff1a;https://threejs.org/docs/index.html#manual/zh/ threejs中文网&#xff1a;http://www.webgl3d.cn/ threejs基础教程&#xff1a;http://www.webgl3d.cn/pages/aac9ab…

《软件工程导论》(第6版)第6章 详细设计 复习笔记

第6章 详细设计 一、详细设计概述 1&#xff0e;目标 &#xff08;1&#xff09;详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统&#xff0c;即经过这个阶段的设计工作&#xff0c;应该得出对目标系统的精确描述&#xff0c;从而在编码阶段可以把这个描述直接…

四足机器人控制算法——建模、控制与实践(unitree_guide配置)

目录 官方文档 unitree_guide 1. 快捷指令 2. ROS安装 3. LCM库安装 3.1. 安装步骤 4. pthread库 5. 工程文件下载 6. 编译 报错&#xff1a; 报错1 报错2&#xff1a; 报错3 其他报错 7. 运行 7.1. 运行 Gazebo 仿真环境 7.2. 启动控制器 8. 简单使用 官方文…

贪心(临项交换)

前言&#xff1a;对待这个问题&#xff0c;我想到就是一定是贪心&#xff0c;但是我不知道怎么排序 对待这种问题&#xff0c;肯定是要先假设只有两个&#xff0c;我们要怎么排序呢 class Solution { public:long long minDamage(int power, vector<int>& damage, v…

分布式主键

目录 1.分布式主键的基本需求 2.常见的分布式主键生成策略 2.1UUID&#xff08;128位&#xff09; 2.2MySQL 2.2.1自增主键 2.2.2区间号段 2.3Redis 2.4SnowFlake雪花算法&#xff08;64位&#xff09; 1.分布式主键的基本需求 全局唯一&#xff1a;不管什么主键&…

Linux驱动(二):模块化编程的基本操作

目录 前言一、模块化编程1.模块化驱动代码框架2.printk详解3.应用操作 二、多模块编程三、多文件编程四、函数传参 前言 没多少东西&#xff0c;就是最基础的一些Linux驱动编写操作。 一、模块化编程 驱动加载到内核中的两种方法&#xff1a; 1.静态编译&#xff1a;就是将模…

【Python百日进阶-Web开发-Feffery】Day500 - dash使用秘籍

文章目录 前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓1 dash应用使用cdn加载静态资源1.1 页面效果1.2 项目源码2 suppress_callback_exceptions=True3 阻止首次回调3.1 阻止所有回调函数的首次回调3.2 阻止单个回调函数的首次回…

《JavaEE进阶》----5.<SpringMVC②剩余基本操作(CookieSessionHeader响应)>

Cookie和Session简介。 Spring MVC的 2.请求 Cookie的设置和两种获取方式 Session的设置和三种获取方式。 3.响应 1.返回静态页面 2.返回数据 3.返回HTML片段 4.返回JSON 5.设置状态码 6.设置header 三、&#xff08;接上文&#xff09;SpringMVC剩余基本操作 3.2postman请求 …

CSAPP Data Lab

CSAPP 的第一个 Lab&#xff0c;对应知识点为书中的第 2 章&#xff08;信息的表示与处理&#xff09;&#xff0c;要求使用受限制的运算符和表达式实现一些位操作。主要分为两个部分&#xff1a;整数部分和浮点数部分。其中整数部分限制较多&#xff0c;比较偏重技巧性&#x…

Red Hat Enterprise Linux 9—Red Hat 9.4Linux系统 Mac电脑虚拟机安装【保姆级教程】

Mac分享吧 文章目录 效果一、下载软件二、安装软件与配置1、安装2、配置 三、查看基本信息安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 地址&#xff1a;www.macfxb.cn 二、安装软件与配置 1、安装 2、配置 三、查看基本信息 安装完成&#xf…

【国考】特值法

特值法 题干中存在乘除关系&#xff0c;且对应量未知。 例3&#xff1a;甲、乙、丙三个工程队的效率比为6&#xff1a;5&#xff1a;4,现将A、B两项工作量相同的工程交给这三个工程队,甲队负责A工程,乙队负责B工程,丙队参与A工程若干天后转而参与B工程.两项工程同时开工,耗时16…