【问题解答】用数组模拟单链表

这篇具有很好参考价值的文章主要介绍了【问题解答】用数组模拟单链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我这里是根据我所遇到和参考大家的问题解答所总结的:
非常推荐大家打卡 y总的算法基础课: 活动 - AcWing
这里的问题也是基于他讲的单链表所总结的。

实现一个单链表,链表初始为空,支持三种操作,数据结构与算法,链表,数据结构,c++

题目:

实现一个单链表,链表初始为空,支持三种操作:

(1) 向链表头插入一个数;

(2) 删除第k个插入的数后面的数;

(3) 在第k个插入的数后插入一个数

现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。

输入格式

第一行包含整数M,表示操作次数。

接下来M行,每行包含一个操作命令,操作命令可能为以下几种:

(1) “H x”,表示向链表头插入一个数x。

(2) “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。

(3) “I k x”,表示在第k个输入的数后面插入一个数x(此操作中k均大于0)。

输出格式

共一行,将整个链表从头到尾输出。

数据范围

1≤M≤100000

所有操作保证合法。


输入样例:
10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6
输出样例:
6 4 6 5

AC代码:

#include <iostream>

using namespace std;

const int N = 100010;


// head 表示头结点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针是多少
// idx 存储当前已经用到了哪个点
int head, e[N], ne[N], idx;

// 初始化
void init()
{
    head = -1;
    idx = 0;
}

// 将x插到头结点
void add_to_head(int x)
{
    e[idx] = x, ne[idx] = head, head = idx ++ ;
}

// 将x插到下标是k的点后面
void add(int k, int x)
{
    e[idx] = x, ne[idx] = ne[k], ne[k] = idx ++ ;
}

// 将下标是k的点后面的点删掉
void remove(int k)
{
    ne[k] = ne[ne[k]];
}

int main()
{
    int m;
    cin >> m;

    init();

    while (m -- )
    {
        int k, x;
        char op;

        cin >> op;
        if (op == 'H')
        {
            cin >> x;
            add_to_head(x);
        }
        else if (op == 'D')
        {
            cin >> k;
            if (!k) head = ne[head];
            else remove(k - 1);
        }
        else
        {
            cin >> k >> x;
            add(k - 1, x);
        }
    }

    for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
    cout << endl;

    return 0;
}

这题如果大家有学过单链表(学校C语言数据结构课程)的基础,再理解这种数组模拟实现的单链表可能会更加容易,因此考虑到部分同学还没学数据结构课程,如下的题解我会写的更加详细一点。


  • 1、head是什么?它的具体作用又是啥?

答:head应该是一个特殊的指针,一开始指向-1,表示链表里没有内容,为空节点,

当链表里有元素的时候,它变成了一个指向第一个元素的指针。还有就是为了最后遍历链表时,知道链表什么时候结束(因为最后实现的链表,它最后一个节点的ne[i]一定等于-1)

  • 2、对于k-1的相关问题?

这个函数含义是 将x插到下标是k的点后面

题目里要将x插入到第k个插入的数后面,第k个插入的数下标是k - 1,所以调用的时候是add(k - 1, x),remove(k-1)。如果你一开始将idx=1(初始化),那么下标和k就统一了,就不需要再k-1了。

  • 3、关于e[idx]、en[idx]和idx的问题?

idx可以理解为一个结点!!

结点:链表的元素,含e[idx],ne[idx]两个部分

e[idx]:结点编号为idx对应的节点值

ne[idx]:结点编号为idx对应的下一个结点的编号

要明白idx只是记录当前的操作的位置,一般实现的链表idx是乱序的(前后的节点的数组下标不需要连续【不理解,可以带入样例观察】),需要通过当前的ne[i]找到下一个idx。这也是两者的联系。

  • 4、对于删除头节点:head=ne[head]的操作?

删除头结点是head指向的结点,也就是链表中的第一个结点,【head指向可能是一个空结点(e数组不存值),或者是非空结点。指向的空结点叫头结点,指向的非空结点叫首元结点,即后者并没有头结点这种概念】(这句只针对学过单链表的同学,没学过的同学不用理会这句话)。但是y总并没有区分这个概念,所以删除头结点就是删除链表的第一个有值的结点,即首元结点,head指向ne[head]是因为head本来就指向它的下一个结点,所以ne[head]就是头结点的下一个结点。

  • 5、为什么最后一个节点的ne[idx]一定等于-1?

首先这个head指的是链表中头节点的下标,当链表中没有节点时head = -1,但当链表中有值插到头节点的时候,head储存的就是这个值的idx1,通过e[idx1]可以求出这个节点的值。而ne[idx1]就等于head之前的值,即-1。如果再在头节点插入一个元素,则head指向这个元素的idx2,而ne[idx2]就等于上一次插入的head值,即idx1。此时,head = idx2,ne[idx2] = idx1,ne[idx1] = -1.

比如:因为初始化head=-1,head指向链表的头节点地址;例如输入H 9后,则有e[0] = 9; ne[0] = -1;head=0;之后无论进行什么操作,链表最后一个节点,其对应的ne数组值一定为-1。

  • 6、为什么每次循环输入的字符ch,用cin>>ch可以ac,而scanf(“%c”,&ch)结果就不行?

这个是分情况的。

有一个特殊的格式 %c

当%c格式的时候,会读取任何字符,包括换行和空格。

当其他格式的时候(不包括正则表达式), 如果空格或者换行出现在前面,会被读取并抛弃

在后面的时候,不会读取,而只是检测

其实这里也可以写成scanf(“ %c”, &ch)【%c前面要加空格】,以过滤空格和回车。

  • 7head=idx++ <=> head=idx , idx++
  • 8、根据1、3和5应该也就不难理解这句话了吧:

 for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';

如果还是不理解,可以带入数据样例分析一下。


上述就是本节我所遇到的和参考大家的问题解答所总结的,对于像第一次面对这种数据结构的新手来说,反复的去查看评论解答很费时间,因此我再这里大概总结了大家的问题,并归纳了大家的解释,希望能够帮助到大家。

有不懂的问题,欢迎留言评论 (>▽<)

最近我也在更:数据结构复习之路(C语言版),针对的是开设此门课程的学校期末需要掌握的必学知识,有需要的可以看看,当然还没开设这门课程的同学,也可以尝试提前学习一下(写的超级详细)。

最后推荐大家去看大佬的详细题解:

大海呀大海:AcWing 826. 单链表 - AcWing

Hasity:AcWing 826. 单链表---图解 - AcWing文章来源地址https://www.toymoban.com/news/detail-821022.html

到了这里,关于【问题解答】用数组模拟单链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenStack云计算相关问题解答

    在 OpenStack 环境中,计算服务通过 API 服务器来控制虚拟机管理程序,它具备一个抽象层,可以在部署时选择一种虚拟化技术来创建虚拟机,向用户提供云服务。 KVM 基于内核的虚拟机(Kernel-based Virtual Machine,KVM)是通用的开放虚拟化技术,也是OpenStack用户使用较多的虚拟化技

    2024年03月21日
    浏览(42)
  • 【lesson59】线程池问题解答和读者写者问题

    单例模式是一种 “经典的, 常用的, 常考的” 设计模式. IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让我们这些菜鸡们不太拖大佬的后腿, 于是大佬们 针对一些经典的常见的场景, 给定了一些对应的解决方案 , 这个就是设

    2024年02月21日
    浏览(28)
  • 高级 Python 面试问题与解答

    ✍ 作者简介: i阿极 ,CSDN 数据分析领域优质创作者, 专注于分享python数据分析领域知识。 ✍ 本文录入于《数据分析之道》 ,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。 ✍ 订阅后,可以阅读《数据分析之道》中

    2024年01月17日
    浏览(33)
  • 解答腾讯会议的常见新手问题

    腾讯会议(Tencent Meeting)为企业打造专属的会议能力,卓越的音视频性能,丰富的会议协作能力,坚实的会议安全保障,提升协作效率,满足大中小会议全场景需求。您可以使用腾讯会议进行远程音视频会议、在线协作、会管会控、会议录制、指定邀请、布局管理、同声传译

    2023年04月19日
    浏览(57)
  • 使用Mybatis-Plus问题解答

    我们使用一个新的框架难免会遇到各种问题,当然使用这款国产的优秀的Mybatis-Plus框架也不例外,下面我就给大家列举一下使用Mybatis-Plus可能遇到的一些问题,并做一下一一的解答。 1:如何排除非表的字段 (这个问题一定要注意,我们Java中写的Entity类的属性是和表的字段一

    2024年02月08日
    浏览(31)
  • 【人工智能】常见问题以及解答

    人工智能(Artificial Intelligence, AI)是一门涉及计算机科学、数学、心理学、哲学等多个领域的交叉学科,旨在研究如何使计算机能够像人一样地思考、学习和行动。 在过去几十年中,人工智能技术得到了广泛的应用和发展,涵盖了诸如机器学习、自然语言处理、计算机视觉、

    2024年02月07日
    浏览(42)
  • 何恺明:在cuhk解答科研问题

    何恺明最近在香港中文大学参加一个讲座过程中所述: Q :您刚刚(演讲)展示的图片,呈现了深度网络加深时,性能先上升后下降的趋势。 起初人们可能误认为是过拟合导致的,就增加数据量,问题确实得到了改善。但又发现当神经网络真的非常深入时,性能还是会再次下

    2024年02月06日
    浏览(28)
  • 【BI系统】选型常见问题解答二

    本文主要总结BI系统选型过程中遇见的常见问题,并针对性做出回答,希望能为即将选型,或正在选型BI系统的企业用户们提供一个快速了解通道。 有针对金蝶云星空的BI方案吗?能起到怎样的作用? 答:奥威BI系统拥有针对金蝶云星空的BI方案,特别是SaaS BI版的,无需下载安

    2024年02月14日
    浏览(29)
  • TeeChart图表控件许可常见问题解答

    Steema是全球领先的图表类控件公司,总部设在西班牙的巴塞罗那附近,Steema公司的VCL图表报表控件在全球拥有极高知名度。TeeChart可以在微软的Visual Studio、Office和.NET以及Java和PHP开发平台中使用,也可以作为本地Javascript-HTML5使用。 TeeChart for .NET是优秀的工业4.0 WinForm图表控件

    2024年02月09日
    浏览(31)
  • 【FAQ】视频编辑服务常见问题及解答

    1、访问贴纸等素材的时候提示“网络异常,请重试”怎么办? 2、使用AI能力时,提示“errorCode:20124 errorMsg:Method not Allowed”? 请做以下检查: 1、在代码中检查鉴权信息是否已设置。如果未设置,可以通过api_key或Access Token来设置,详情请查看“1.设置应用的鉴权信息”章节。

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包