【c++】单链表

单链表
时间限制:1秒 内存限制:128M
题目描述
实现一个单链表,链表初始为空,支持三种操作:

1、向链表头插入一个数;

2、删除第k个插入的数后面的数

3、在第k个插入的数后插入一个数

现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。

输入描述
第一行包含整数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

AC代码:

#include <iostream>
using namespace std;
const int  n=100010;
int head=-1;
int ver[n],Next[n];
int tot=-1;
void add_to_head(int x){
    ver[++tot]=x;
    Next[tot]=head;
    head=tot;
}
void add(int k,int m){
    ver[++tot]=m;
    Next[tot]=Next[k];
    Next[k]=tot;
}
void removea(int k){
    Next[k]=Next[Next[k]];
}
int main()
{
    int m;
    cin>>m;
    while(m--){
        int k,x;
        char op;
        cin>>op;
        if(op=='H'){
            cin>>x;
            add_to_head(x);
        }
        else if(op=='D'){
            cin>>k;
            if(!k) head=Next[head];
            else removea(k-1);
        }
        else{
            cin>>k>>x;
            add(k-1,x);
        }
    }
    for(int i=head;i!=-1;i=Next[i]){
        cout<<ver[i]<<" ";
    }
    cout<<endl;
    return 0;
}
单链表是一种线性数据结构,其元素不是连续存储在内存中的。相反,每个元素由一个节点表示,该节点包含两部分信息:一部分用于存放实际的数据;另一部分是一个指针(也称为链接),指向下一个节点的位置。最后一个节点的指针通常为空(NULL),表明这是列表的最后一项。 ### C++ 单链表的基本操作 1. **创建结点** - 每个结点一般包括两个成员变量,一个是保存数据值的数据域(`data`),另一个是指向下一结点地址的指针域(`next`). ```cpp struct Node { int data; // 数据域 Node* next = nullptr; // 初始化为NULL, 指针域,默认情况代表没有后续节点 }; ``` 2. **插入新结点** 插入可以发生在头部、尾部或是指定位置之前/之后。最常见的是头插法和尾插法: * 头插法(Insert at Head)就是在链表的第一个位置添加新的节点; * 尾插法则是在已存在的链表末尾追加一个新的节点。 3. **遍历链表** 遍历意味着从第一个到最后一共访问所有的节点,并对它们执行某些特定的任务如打印出来。 使用while循环直到遇到null停止。 4. **删除结点** 删除某个给定值得所有实例或者是仅移除第一次出现的那个匹配项。 5. **查找结点** 查找是否含有某特定数值或者定位到第几个位置上存在这样的数等。 下面给出简单的例子演示如何实现上述功能之一—将数字加入到单链表: ```cpp #include <iostream> using namespace std; struct Node { int value; Node *next; }; class LinkedList{ private: Node *head,*tail; public: LinkedList() : head(nullptr), tail(nullptr){ } void add(int val){ Node *newNode=new Node{val,nullptr}; if(!head){// If list is empty. head=tail=newNode; }else{// Add to the end of existing nodes. tail->next=newNode; tail=newNode; } } ~LinkedList(){ while(head != NULL){ Node* temp=head; head=head->next; delete temp; } } }; int main(){ LinkedList mylist; for (size_t i = 0; i <= 9 ; ++i) mylist.add(i); } ``` 上面的例子展示了怎样定义了一个名为 `Node` 的结构体以及基于此构建了基本版的单项链表类 (`LinkedList`). 此外还实现了构造函数初始化空列表,析构函数安全地释放分配的空间,并提供了一种简单的方式通过`add()`方法来增加整型元素至链尾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值