题意:
构造一个单向链表,从单向链表中删除指定值的节点,并输出。
注意:链表的值不能重复。
方法一:
map模拟链表
思路:根据题意中链表的值不能重复,则可以用map模拟链表的实现。首先,依据map的映射关系构建一个链表;
然后,遍历链表输出,输出的时候排除指定值的节点。
#include <bits/stdc++.h> using namespace std; int main(){ unordered_map<int,int> m;//链表的值不能重复 int n,x,y,a,b; cin >> n >> x; for(int i=0;i<n-1;i++){ cin >> a >> b; if(m.count(b)==0)//构建链表 m[b]=a; else{ m[a]=m[b];//插入元素 m[b]=a; } } cin >> y; int p=x;//遍历指针p while(m.count(p)){//遍历输出 if(p!=y){ cout << p << " "; } p=m[p]; } if(p!=y) cout << p << endl; return 0; }
时间复杂度:空间复杂度:
方法二:
链表
思路:构造链表。
根据输入模拟链表的插入操作。最后,循环链表,并输出值不为给定值的节点。
#include <bits/stdc++.h> using namespace std; struct node{ int val; node *next; node(int x):val(x),next(nullptr){} }; int main(){ int n,x,y,a,b; cin >> n >> x; node *head=new node(x);//新建头结点 for(int i=0;i<n-1;i++){ cin >> a >> b; node *p=new node(a);//新建新节点 node *q=head; while(q&&q->val!=b){//循环找到值为b的节点 q=q->next; } p->next=q->next;//插入操作 q->next=p; } cin >> y; node *p=head; while(p){ if(p->val!=y){//输出值不为y的节点 cout << p->val << " "; } p=p->next; } cout << endl; return 0; }
时间复杂度:空间复杂度: