提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
思路
需要识别insert和delete,其余部分为链表基础
一、函数部分
1.search和print
search用于定位于需要的节点前面一位;
print用于最后打印出答案;
void print(ListNode* head){
ListNode* cur=head;
if(cur==NULL)
printf("NULL");
while(cur){
printf("%d ",cur->data);
cur=cur->next;
}
}
void search(ListNode* head,ListNode** p,int x){
ListNode* cur=head;
while(cur->next){
if(cur->next->data==x){
*p=cur;
return;
}
cur=cur->next;
}
2.insert和delete
insert函数先用search定位,之后在对链表插入;
delete函数原理相同,先定位,再删除;
两个函数都要考虑特殊情况,如空链表;
void insert(ListNode* head,int x,int y){
ListNode* prev=NULL;
search(head,&prev,x);
ListNode* newnode=(ListNode*)malloc(sizeof(ListNode));
newnode->data=y;
newnode->next=prev->next;
prev->next=newnode;
}
void delete(ListNode* head,int x){
ListNode* prev=NULL;
search(head,&prev,x);
if(prev==NULL||prev->next==NULL)
return;
else if(prev->next!=NULL){
ListNode* next=prev->next->next;
free(prev->next);
prev->next=next;
}
}
二、主函数
用strcmp函数可以确定使用insert还是delete;
这里链表是带头的,所以print函数用head-next;
int main() {
int n,x,y;
char s[10];
scanf("%d",&n);
ListNode* head=(ListNode*)malloc(sizeof(ListNode));
head->next=NULL;
while(n--){
scanf("%s",&s);
if(strcmp(s,"insert")==0){
scanf("%d%d",&x,&y);
insert(head,x,y);
}else if(strcmp(s,"delete")==0){
scanf("%d",&x);
delete(head,x);
}
}
print(head->next);
return 0;
}
总结
今天在牛客上看到的模板题,算是对于链表的巩固,前两天开始学链表,开始练手,链表更多的是使用带头双向循环链表,我还在熟悉中。