AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 826. 单链表    原题链接    简单

作者: 作者的头像   小张同学 ,  2020-02-27 20:35:18 ,  阅读 359


3


1
  • int head; head 是 头结点的下一个节点
  • int idx; idx 是 当前节点的下标
  • int e[N]; e[N] 是 节点i的值
  • int ne[N]; ne[N] 是 节点i的next指针,也就是指向下一个节点

note:
- 注意 这道题说:第 k 个插入的数 是指 下标为 k-1 的数
- head = -1表示把整个链表清空,删除头结点应该是将第一个节点跳过去:head = ne[head]。

这道题样例过程

删除一个点后面的数 是指 删除后面的单个节点,而不是删除后面所有的
我之前理解错了,现在更正
TIM图片20200227225356.png

C++ 代码

#include <iostream>

using namespace std;

const int N = 100010;


int head;  // head  是 头结点的下一个节点
int idx;   // idx   是 当前节点的下标
int e[N];  // e[N]  是 节点i的值
int ne[N]; // ne[N] 是 节点i的next指针,也就是指向下一个节点

void init()
{
    head = -1;
    idx = 0;
}

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

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

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

int main()
{
    int n;
    cin >> n;
    init();

    int k, x;
    char op;

    while(n -- )
    {
        cin >> op;
        if (op == 'H')
        {
            cin >> x;
            add_to_head(x);
        }
        else if (op == 'D')
        {
            cin >> k;
            if (!k) head = ne[head];  // head = -1表示把整个链表清空,删除头结点应该是将第一个节点跳过去:head = ne[head]。
            remove(k - 1);  // 注意这里的是 k - 1。第 k 个插入的数是指下标为 k-1 的数
        }
        else
        {
            cin >> k >> x;
            add(k - 1, x);  // 这里也是 k - 1
        }

    }

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

    return 0;
}
  • int head; head 是 头结点的下一个节点 (我觉得y总上课讲的时候写的有点小问题)
    这样就就能解释得了 将x插到头结点的位置 ne[idx] = head; 而不是ne[idx] = ne[head]

我是新手,如若理解的有问题,欢迎指出并教导~谢谢~

1 评论


用户头像
ranba   9个月前     回复

head不是头结点的下一个节点。head的值就是头节点的下标

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息