数组模拟双链表

题目

代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int e[N], idx, l[N], r[N];

void init()
{
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

void insert_k(int k, int x)
{
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
    idx++;
}

void erase_k(int k)
{
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

void output()
{
    for (int i = r[0]; i != 1; i = r[i])
    {
        cout << e[i] << " ";
    }
}
int main()
{
    int m;
    cin >> m;
    init();
    while (m--)
    {
        string str;
        cin >> str;
        if (str == "L")
        {
            int x;
            cin >> x;
            insert_k(0, x);
        }
        else if (str == "R")
        {
            int x;
            cin >> x;
            insert_k(l[1], x);
        }
        else if (str == "D")
        {
            int k;
            cin >> k;
            erase_k(k + 1); // 实际的数据节点从索引2开始(0和1都是哨兵节点)。这样的话,当用户输入的是第k个插入的元素,而数组的索引应从2开始,所以需要k+1来调整。
        }
        else if (str == "IL")
        {
            int k, x;
            cin >> k >> x;
            insert_k(l[k + 1], x);
        }
        else if (str == "IR")
        {
            int k, x;
            cin >> k >> x;
            insert_k(k + 1, x);
        }
    }
    output();

    return 0;
}
posted @ 2025-02-27 16:04  electricity111  阅读(22)  评论(0)    收藏  举报