- 2022tysc1451 的博客
链表
- 2025-4-12 11:09:40 @
讲义
一、自己创建一个链表
1.用地址来模拟链表
#include<iostream>
using namespace std;
struct node{
int dalta;
node *next;//下一个的指针
};
node *head=NULL,*p,*q;
void head_list(){//头部插入
int n,x;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
p=new node;
p->dalta=x;
p->next=head;
head=p;
}
}
void print_list(){//输出
p=head;
while(p!=NULL){
cout<<p->dalta<<" ";
p=p->next;
}
cout<<"\n";
}
void insert_list(int k,int x){//插入
q=new node;
q->dalta=x;
if(k==1){
q->next=head;
head=q;
}else{//中间或尾部插入
int i=1;
p=head;
while(i<k-1){
p=p->next;
i++;
}
q->next=p->next;
p->next=q;
}
}
void delete_list(int k){//插入
if(k==1){
p=head;
head=p->next;
delete p;
}else{
int i=1;
p=head;
while(i<k-1){
p=p->next;
i++;
}
q=p->next;
p->next=q->next;
delete q;
}
}
int main(){
}
#include<iostream>
using namespace std;
struct list{int dalta,next;}a[100001];
int n,x,head=-1,tot;
void c_l(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[++tot].dalta=x;
a[tot].next=head;
head=tot;
}
}
void p_l(){
int p=head;
while(p!=-1){
cout<<a[p].dalta<<" ";
p=a[p].next;
}
cout<<"\n";
}
void i_l(int k,int x){//插入
a[++tot].dalta=x;
if(k==1){
a[tot].next=head;
head=tot;
}else{
int i=1,p=head;
while(i<k-1){
p=a[p].next;
i++;
}
a[tot].next=a[p].next;
a[p].next=tot;
}
}
int main(){
c_l();
i_l(3,8);
p_l();
}
2.用一个数组来模拟链表的操作
#include<iostream>
using namespace std;
struct list{int dalta,next;}a[100001];
int n,x,head=-1,tot;
void c_l(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[++tot].dalta=x;
a[tot].next=head;
head=tot;
}
}
void p_l(){
int p=head;
while(p!=-1){
cout<<a[p].dalta<<" ";
p=a[p].next;
}
cout<<"\n";
}
void i_l(int k,int x){//插入
a[++tot].dalta=x;
if(k==1){
a[tot].next=head;
head=tot;
}else{
int i=1,p=head;
while(i<k-1){
p=a[p].next;
i++;
}
a[tot].next=a[p].next;
a[p].next=tot;
}
}
int s(int x){
if(head==-1)return -1;
if(a[head].dalta>x)return -1;
int p=head;
while(a[p].next!=-1&&a[a[p].next].dalta<x){
p=a[p].next;
}
return p;
}
void sort(int x){
a[++tot].dalta=x;
int p=s(x);
if(p==-1){
a[tot].next=head;
head=tot;
}else{
a[tot].next=a[p].next;
a[p].next=tot;
}
}
int main(){
}
二、c++的标准库中也有链表的操作(< list >/< forward_list >)
常用操作:
操作 | std::list (双向链表) |
std::forward_list (单向链表) |
时间复杂度 |
---|---|---|---|
插入操作 | |||
头部插入 | lst.push_front(val) |
flst.push_front(val) |
O(1) |
尾部插入 | lst.push_back(val) |
❌ 不支持(需手动遍历后插入) | O(1) / 不支持 |
任意位置插入 | lst.insert(iterator, val) |
flst.insert_after(iterator, val) |
O(1) |
删除操作 | |||
头部删除 | lst.pop_front() |
flst.pop_front() |
O(1) |
尾部删除 | lst.pop_back() |
❌ 不支持(需手动遍历后删除) | O(1) / 不支持 |
删除指定迭代器元素 | lst.erase(iterator) |
flst.erase_after(iterator) |
O(1) |
删除所有指定值 | lst.remove(val) |
flst.remove(val) |
O(n) |
访问操作 | |||
访问头元素 | lst.front() |
flst.front() |
O(1) |
访问尾元素 | lst.back() |
❌ 不支持(需遍历到尾部) | O(1) / 不支持 |
容量操作 | |||
判断是否为空 | lst.empty() |
flst.empty() |
O(1) |
获取元素数量 | lst.size() |
❌ 不支持(需遍历计数或手动维护) | O(1) / O(n) |
其他操作 | |||
反转链表 | lst.reverse() |
flst.reverse() |
O(n) |
排序 | lst.sort() |
flst.sort() |
O(n log n) |
合并有序链表 | lst1.merge(lst2) |
flst1.merge(flst2) |
O(n) |
去重 | lst.unique() |
flst.unique() |