一. 题目

二. 理论

1. 数组模拟版

image-mxol.png

2. 类指针版

  • 单链表是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含两个部分:

  • 数据域(Data Field):存储节点的数据内容。

  • 指针域(Pointer/Next Field):存储指向下一个节点的指针。不用指针就是整个副本,开销很大,且会导致递归包含,类包含自己了!!!

  • 单链表的特点是节点之间通过指针连接,形成一个线性结构。头节点指向链表的第一个节点,尾节点的指针为 null(表示链表的终止)。与数组不同,单链表的大小可以动态调整,因为不需要连续的内存空间。

三. 代码

1. 数组模拟版

class SingleLinkedList
{
public:
    //数组模拟单链表版
    static const int N=1e5+10;
    int h[N], e[N], ne[N], idx;
public:
    static void initIO()
    {
        // 关闭输入输出缓存,使效率提升
        ios::sync_with_stdio(false);
        // 解除cin和cout的默认绑定,来降低IO的负担使效率提升
        cin.tie(nullptr);
        cout.tie(nullptr);
    }

    SingleLinkedList()
    {
        /**
         * 初始化
         * idx代表边的编号
         * h代表头结点数组,h[x]代表第x节点的链表,x是节点编号,h[x]的值是x链表第一条边的编号
         * ne[b], b是边的编号,ne[b]的值也是边的编号,ne[b]表示边的编号为b的边所指的节点的下一条边的编号
         * e[c], c是边的编号,e[c]表示边c所指的点的点的编号
         */
        idx=0;
        fill(e, e+N, 0);
        fill(h, h+N, -1);
        fill(ne, ne+N, 0);
    }

    /**
     * 头插法
     * 点a向点b接一条边
     * @param a
     * @param b
     */
    void addHead(int a, int b)
    {
        e[idx]=b, ne[idx]=h[a], h[a]=idx++;
    }
};

SingleLinkedList L;//创建单链表数组

int main()
{
    L.addHead(1, 2);
    L.addHead(1, 3);
}

2. 类指针版

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

class SingleLinkedList
{
public:
    class SingleLinkedNode
    {
        public:
            int val;
            SingleLinkedNode *next;
        public:
            SingleLinkedNode(int val_):val(val_), next(nullptr) {}
    };
public:
    //头结点值为-1,方便处理链表中没有节点的情况。
    //实际链表头是head.next
    SingleLinkedNode head;
public:
    static void initIO()
    {
        // 关闭输入输出缓存,使效率提升
        ios::sync_with_stdio(false);
        // 解除cin和cout的默认绑定,来降低IO的负担使效率提升
        cin.tie(nullptr);
        cout.tie(nullptr);
    }

    SingleLinkedList():head(-1) {}

    /**
     * 头插法
     * @param val 节点值
     */
    void add_to_head(int val)
    {
        SingleLinkedNode *node=new SingleLinkedNode(val);
        node->next=head.next;
        head.next=node;
    }

    ~SingleLinkedList()
    {
        //p表示前一个,q表示后一个
        SingleLinkedNode *p=head.next, *q;
        while(p != nullptr)
        {
            q=p->next;
            delete p;
            p=q;
        }
    }
};

int main()
{
    SingleLinkedList::initIO();
    SingleLinkedList list;//创建一个单链表
}