移除链表元素两种方法
1.头结点单独处理
2.虚拟头结点
一、头结点单独处理
当我们想要删除的元素在头结点时,我们只需要把头结点的下一个节点作为头结点即可
head=head->next;
当我们想要删除的节点在中间节点时,例如,
想要删除元素2这个节点,我们只需要将head节点的下一个节点指向元素3这个节点即可,关键代码:head->next=head->next->next(举个例子)
头节点单独处理的完整代码
#include <stdio.h>
#include <stdlib.h>
#define NEW (Node*)malloc(sizeof(Node))//常量开辟空间
typedef struct node {//typedef 将node名转化为Node
int data;//数据
struct node * next;//下一个节点
}Node;
int main(){
Node *head,*p,*q;//
q=head=NEW;//申请了一个head节点 ,q和head同时指向刚刚申请的节点
// p->data=100;
head->data=100;//给head赋值为100
int i=10;
while(i){//建立多个节点,并且给他进行赋值
p=NEW;
p->data=i;
q->next=p;
q=p;
i--;
}
q->next=NULL;//确保最后一个节点的下个节点为NULL
int m;
scanf("%d",&m);//输入我们想要删除的节点
while(head!=NULL&&head->data==m){//如果在头节点那么就只需要把头节点换到下一个位置
head=head->next;
}
Node *cru;//新定义一个节点让其指向头节点,来完成下面的操作,保证我们的头结点没有改变
cru=NEW;
cru=head;
while(cru!=NULL&&cru->next!=NULL){//从头节点的下一个节点开始判断,首先如果等于我们的值就让该节点的下一个节点为下下个节点 ,要保证我们的下一个节点和该节点不为空
if(cru->next->data==m){
cru->next=cru->next->next;
}else{
cru=cru->next;//如果不满足就往下寻找
}
}
for(int i=0;i<9;i++){
printf("%d\n",head->data);
head=head->next;
}
return 0;
}
二、虚拟头结点法:
建立一个虚拟头结点,它的下一个节点是head,这样无论我们删除的元素是在头节点还是中间节点我们都可以使用,head->next=head->next->next(举个例子),就是将该节点的下一个节点指向下一个节点的下一个节点。
虚拟头结点的完整代码
#include <stdio.h>
#include <stdlib.h>
#define NEW (Node*)malloc(sizeof(Node))//常量开辟空间
typedef struct node {//typedef 将node名转化为Node
int data;//数据
struct node * next;//下一个节点
}Node;
int main(){
Node *head,*p,*q;//
q=head=NEW;//申请了一个head节点 ,q和head同时指向刚刚申请的节点
// p->data=100;
head->data=100;//给head赋值为100
int i=10;
while(i){//建立多个节点,并且给他进行赋值
p=NEW;
p->data=i;
q->next=p;
q=p;
i--;
}
q->next=NULL;//确保最后一个节点的下个节点为NULL
int m;
scanf("%d",&m);//输入我们想要删除的节点
Node *dhead;
dhead=NEW;
dhead->next=head; //建立一个虚拟头结点,他的下一个地址为head
Node *cru;//新定义一个节点让其指向头节点,来完成下面的操作,保证我们的头结点没有改变
cru=NEW;
cru=dhead;
while(cru!=NULL&&cru->next!=NULL){//从头节点的下一个节点开始判断,首先如果等于我们的值就让该节点的下一个节点为下下个节点 ,要保证我们的下一个节点和该节点不为空
if(cru->next->data==m){
cru->next=cru->next->next;
}else{
cru=cru->next;//如果不满足就往下寻找
}
}
for(int i=0;i<9;i++){
printf("%d\n",head->data);
head=head->next;
}
return 0;
}