【数据结构】01:链表

链表


1.单链表

数组实现的链表可以做指针实现的链表的所有事情,且数组实现的链表更快(静态链表),动态链表new操作太慢。

用数组模拟单链表,使用单链表构建一个邻接表(n个链表),用邻接表(最短路问题、最小生成树、最大流)进行存储图和树,

在这里插入图片描述

int head;//头结点的next指针
int data[MAX], next[MAX];//结点数据data、下一个结点的下标next
int currt;//当前可用点的下标

2.双链表

用数组模拟双链表,双链表可用于优化某些问题,

image-20230331110238899

int dataa[MAX], left[MAX], right[MAX];//结点数据dataa、下一个结点的下标nextt
int currt;//当前可用点的下标

3.AcWing826.单链表

#include<iostream>
using namespace std;

const int MAX = 100010;

int head;//头结点的next指针
int dataa[MAX], nextt[MAX];//结点数据dataa、下一个结点的下标nextt
int currt;//当前可用点的下标

void link_list_init() {
    head = -1;
    currt = 0;
}

void link_list_head_insert(int x) {
    dataa[currt] = x;
    nextt[currt] = head;
    head = currt;
    currt++;
}

void link_list_insert(int idx, int x) {
    dataa[currt] = x;
    nextt[currt] = nextt[idx];
    nextt[idx] = currt;
    currt++;
}

void link_list_delete(int idx) {
    nextt[idx] = nextt[nextt[idx]];
}

int main() {
    int m; cin >> m;
    char op; int x, idx;
    link_list_init();
    while (m--) {
        cin >> op;
        switch (op) {
            case 'H':
                cin >> x;
                link_list_head_insert(x);
                break;
            case 'D':
                cin >> idx;
                if (!idx) head = nextt[head];
                link_list_delete(idx - 1);
                break;
            case 'I':
                cin >> idx >> x;
                link_list_insert(idx - 1, x);
                break;
            default:
                cout << "input error!" << endl;
                break;
        }
    }
    for (int i = head; i != -1; i = nextt[i]) cout << dataa[i] << " ";
    cout << endl;
    return 0;
}

4.AcWing827.双链表

#include<iostream>
#include<string>
using namespace std;

const int MAX = 100010;

int dataa[MAX], leftt[MAX], rightt[MAX];//结点数据dataa、下一个结点的下标nextt
int currt;//当前可用点的下标

/* 0表示左端点 1表示右端点 */
void link_list_init() {
    rightt[0] = 1;
    leftt[1] = 0;
    currt = 2;
}

void list_insert_head(int x) {
    leftt[currt] = 0;
    rightt[currt] = rightt[0]; 
    dataa[currt] = x;
    leftt[rightt[0]] = currt;
    rightt[0] = currt;
    currt++;
}

void list_insert_tail(int x) {
    rightt[currt] = 1;
    leftt[currt] = leftt[1]; 
    dataa[currt] = x;
    rightt[leftt[1]] = currt;
    leftt[1] = currt;
    currt++;
}

void list_delete(int idx) {
    rightt[leftt[idx]] = rightt[idx];
    leftt[rightt[idx]] = leftt[idx];
}

void list_insert_rightt(int idx, int x) {
    leftt[currt] = idx;
    rightt[currt] = rightt[idx];
    dataa[currt] = x;
    leftt[rightt[idx]] = currt;
    rightt[idx] = currt;
    currt++;
}

int main() {
    int m; cin >> m;
    string op; int x, idx;
    link_list_init();
    while (m--) {
        cin >> op;
        if (op == "L") {
            cin >> x;
            list_insert_head(x);
        } else if (op == "R") {
            cin >> x;
            list_insert_tail(x);
        } else if (op == "D") {
            cin >> idx;
            if (!idx) rightt[0] = rightt[rightt[0]];
            list_delete(idx + 1);
        } else if (op == "IR") {
            cin >> idx >> x;
            list_insert_rightt(idx + 1, x);
        } else {
            cin >> idx >> x;
            list_insert_rightt(leftt[idx + 1], x);
        }
    }
    for (int i = rightt[0]; i != 1; i = rightt[i]) cout << dataa[i] << " ";
    cout << endl;
    return 0;
}

tips:文章内容参考acwing算法刷题课程,题解图示内容及代码根据老师课程、以及自己对知识的理解,进行二次整理和部分补充,仅供学习参考使用,不可商业化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值