0.删除(单链表)
若要删除一个节点p,需知道前一个节点的位置
node *searchPr(node *h,int k){//寻找节点值为k的位置
node *p=h;
while(p->next!=NULL)//p的下一个节点 不为空
{
if(p->next->data==k) return p;//值为k,返回位置p
p=p->next; //p向前
}
return NULL;//没有值为k的节点,返回空
}
void deletNode(node *h,int k){
//在链表中删除数据域为k的节点
//1. 找到删除节点的前一个位置
node *pr=searchPr(h,k);//寻找值为k的对应节点的位置
//2. 重新连接
node *p=pr->next;//p指向要删除的节点
//2.2 将前一个节点连向后一个节点
pr->next=p->next;
p->next=NULL;//连接后使前一个节点为空
//3.销毁空间
delete p;
}
0.1.节点定义
typedef struct node{
int data;//节点数据
node *next;//下一个节点的位置
node *pre;//前一个节点的位置
}node;
1.链表创建
node *creat(node *h,int n){
node *p=h;
for(int i=1;i<=n;i++){
int x;
cin>>x;//输入需要放入链表的值(组成链表)
node *s=new node;//拓展空间
s->data=x;//使节点数据为需要放入链表的值
s->next=s->pre=NULL;
p->next=s;
s->pre=p;
p=p->next;//p向前移动
}
return p;//返回链表
}
2.链表遍历
void show(node *h){//方法一
//遍历链表
node *p=h->next;
while(p!=NULL){
cout<<p->data<<" ";
//p向后移动
p=p->next;
}
}
void show2(node *t,node *h){//方法二
//遍历链表
node *p=t;
while(p!=h){
cout<<p->data<<" ";
p=p->pre;
}
}
3.链表插入
void insertRight(node *p,node *s){
//右插法
node *aft=p->next;
p->next=s;
s->pre=p;
s->next=aft;
if(aft!=NULL){
aft->pre=s;
}
}
void insertLeft(node *p,node *s){
//左插法
node *q=p->pre;
s->next=p;
s->pre=q;
p->pre=s;
if(q!=NULL){
q->next=s;
}
}