题解:AcWing 826 单链表

【题目来源】

AcWing:826. 单链表 - AcWing题库

【题目描述】

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

  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\))。

【输出】

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

【输入样例】

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

【解题思路】

image

【算法标签】

《AcWing 826 单链表》 #链表#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;  // 定义链表最大容量

// 全局变量定义
int head;      // 头结点下标,初始为-1表示空链表
int e[N];      // e[i]存储节点i的值
int ne[N];     // ne[i]存储节点i的下一个节点下标
int idx;       // 当前可用节点索引,从0开始

/**
 * 初始化链表
 */
void init()
{
    head = -1;  // 头指针初始化为-1
    idx = 0;    // 从0开始分配节点
}

/**
 * 在链表头部插入节点
 * @param x 要插入的值
 */
void add_to_head(int x)
{
    e[idx] = x;     // 存储节点值
    ne[idx] = head; // 新节点指向原头节点
    head = idx;     // 更新头指针
    idx++;          // 分配下一个可用节点
}

/**
 * 在指定位置后插入节点
 * @param k 要插入的位置前驱节点下标
 * @param x 要插入的值
 */
void add(int k, int x)
{
    e[idx] = x;      // 存储节点值
    ne[idx] = ne[k]; // 新节点指向原k节点的下一个节点
    ne[k] = idx;     // k节点指向新节点
    idx++;           // 分配下一个可用节点
}

/**
 * 删除指定位置后的节点
 * @param k 要删除的位置前驱节点下标
 */
void remove(int k)
{
    ne[k] = ne[ne[k]];  // 跳过下一个节点,直接指向下下个节点
}

int main()
{
    int m;  // 操作次数
    cin >> m;
  
    init();  // 初始化链表
  
    while (m--)
    {
        char op;  // 操作类型
        int k, x; // 操作参数
      
        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);   // 删除第k个节点后的节点
        }
        else 
        {
            // 指定位置插入操作
            cin >> k >> x;
            add(k - 1, x);       // 在第k个节点后插入
        }
    }
  
    // 遍历输出链表
    for (int i = head; i != -1; i = ne[i])
        cout << e[i] << " ";
    cout << endl;
  
    return 0;
}

【运行结果】

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
posted @ 2026-02-21 19:22  团爸讲算法  阅读(14)  评论(0)    收藏  举报