已知:单链表中各节点的元素值为整型且递增有序;
设计算法:删除单链表中大于mink且小于maxk的所有元素,并释放被删除节点的存储空间。
算法思想:分配头节点空间,再循环为数组中每个元素创建新节点构建链表;用两个指针遍历链表,当节点值满足条件,跳过该结点并释放其内存空间,否则继续遍历,直至结束。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node,*LinkList;
void buildList(LinkList &L,int a[],int n){
L=(LinkList)malloc(sizeof(Node));//分配头节点空间
L->data=0;//初始化头节点
Node*s,*r=L;//s为新节点,r为尾节点
for (int i = 0; i < n; i++){
s=(Node*)malloc(sizeof(Node));
s->data=a[i];
r->next=s;
r=r->next;
}
r->next=NULL;
}
void printList(LinkList L){
Node *p=L->next;//从第一个节点,即头节点的下一个节点开始
while (p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
}
void deleteInrange(LinkList &L,int mink,int maxk){
Node *pre=L;//前驱节点指针初始指向头节点
Node *p=L->next;//当前节点指针指第一个节点
Node *toBeDeleted;//临时节点指针
while (p!=NULL){
if (p->data>mink && p->data<maxk){//如果满足条件则跳过当前节点
pre->next=p->next;
toBeDeleted=p;
p=p->next;
free(toBeDeleted);
}else{//否则继续遍历
pre=p;
p=p->next;
}
}
}
int main(){
LinkList L;
int a[]={1,2,3,4,5,6,7,8,9,10};
int n=10;//插入链表的元素个数
buildList(L,a,n);
printList(L);
int mink=3;
int maxk=8;
deleteInrange(L,mink,maxk);
printf("\n");
printList(L);
return 0;
}