目录
链表的特征
支持在任意位置插入或删除,但只能按顺序访问其中的元素。
常用于“倒序处理”,因为链表容易执行“删除”操作。
以struct存储节点的价值,以及prev,next。
prev,next两个指针指向前后相邻的两个节点,构成双向链表。
通常建立额外的两个节点head、tail来代表链表的头尾,规范边界。
// struct储存建立
struct Node{
int value; //数据
Node *prev,*next; //指针
};
Node *head,*tail;
或者
struct Node{
int value;
int prev,next;
}node[SIZE];
int head,tail,tot;
// 建新链表,初始时将head、tail相连
void init(){
head=new Node();
tail=new Node();
head->next = tail;
tail->prev = head;
}
或者
void init(){
tot=2; head=1; tail=2;
node[head].next=tail;
node[tail].prev=head;
}
// 在p后插入包含数据val的新节点
void insert(Node *p,int val){
q=new node();
q->value = val;
p->next->prev = q;
//↑↑↑在p原来连接的next上,prev值变成q
q->next = p->next;
p->next = q;
q->prev = p;
}
或者
void insert(int p,int val){
q=++tot; //增加新的编号
node[q].value=val;
node[node[p].next].prev=q;
node[q].next=node[p].next;
node[p].next=q;
node[q].prev=p;
}
// 删除元素p
void remove(Node *p){
p->prev->next=p->next;
p->next->prev=p->prev;
delete p; //指针型记得写删除
}
或者
void remove(int p){
no