IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表(双链表) -> 正文阅读

[数据结构与算法]链表(双链表)

双链表和单链表类似,单链表是每个节点有一个指针指向后面一个节点,双链表是每个节点有两个指针,一个指向前,一个指向后

题目:

题解:

//e[i]表示节点i的值
//l[i]表示每个点向左指向的节点,r[i]表示每个点向右指向的节点
//idx存储当前已经用到了哪个点
int e[N], l[N], r[N],idx;

//初始化

定义下标为0的点为头节点(head),下标为1的点为尾节点?(tail)

void init()
{
    l[1] = 0, r[0] = 1;  //0节点的右边是1,1节点的左边是0
    idx = 2;  //此时已经用掉两个点了
}

//在第 K 个点右边插入一个 X?

void add(int k, int x)
{
    e[idx] = x;
    l[idx] = k;  
    r[idx] = r[k]; 
    l[r[k]] = idx;  //调整k右边节点的指针
    r[k] = idx;     //调整k节点的指针
    idx++;
}

//在第k个点左边插入一个数

可以再写一个 ,也可以直接调用我们这个函数,在 k 的左边插入一个 数 等价于在 l[k] 的右边插入一个数 add(l[k],x)?

//删除第 k个 点

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

代码:

#include<iostream>
using namespace std;
const int N = 1e5 + 10;

int e[N], l[N], r[N];
int idx;

//初始化
void init()
{
    l[1] = 0, r[0] = 1;  //第一个点的右边是1,第二个点的左边是0
    idx = 2;   //此时已经用掉两个点了
}

//在第k个点右边插入一个数x 
void add(int k, int x)
{
    e[idx] = x;
    l[idx] = k;
    r[idx] = r[k]; 
    l[r[k]] = idx;
    r[k] = idx;
    idx++;
}

//删除第k个节点
void remove(int k)
{
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

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

    while(m--)
    {
        string op;
        cin >> op;
        int k, x;

        if(op=="R")
        {
            cin >> x;
            add(l[1], x); //0和1只是代表头和尾,所以最右边插入只要在指向1的那个点的右边插入就可以了
        }

        else if(op=="L")//同理,最左边插入就是在指向0的数的左边插入就可以了,也就是可以直接在0的有右边插入
        {
            cin >> x;
            add(0, x);
        }

        else if(op=="D")
        {
            cin >> k;
            remove(k + 1);
        }

        else if(op=="IL")
        {
            cin >> k >> x;
            add(l[k + 1], x);
        }

        else
        {
            cin >> k >> x;
            add(k + 1, x);
        }    
    }

    for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';

    return 0;
}

有关算法竞赛的题目会继续更新,欢迎评论交流!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:58:02  更:2022-02-07 14:00:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:33:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码