讲义

一、自己创建一个链表

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()