HJ48 从单向链表中删除指定值的节点
题目:https://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f?tpId=37&tqId=21271&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
链表模板题,这么多年都不太会用C++里自带的链表,只会自己手写,正好练一下
由于是单向并且没有重复数字的链表,所以链表长度为n时读入的边条数就是n-1。用哈希表存储每个数值对应的地址。读入时判断一下哈希值是否存在,如果哈希值存在则说明这个点刚刚出现过,现在又出现是要进行点插入操作。其他正常处理维护一下就行。
ListNode(int x):val(x),next(nullptr){};是结构体构造函数的一种简便写法,用于初始化一个点的val=x,next=nullptr;
其实除了系统自带链表的用法有点复杂以外真没什么好说的。
华为光产品线我来了> <为啥不是华为计算呢?因为华为计算人太多了怕挤不过,而且光产品的主管很爱我的样子QwQ
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ListNode{ 4 int val; 5 ListNode* next; 6 ListNode(int x):val(x),next(nullptr){}; 7 }; 8 void PrintList(ListNode* hd){ 9 while(hd!=nullptr){ 10 cout<<hd->val<<" "; 11 hd=hd->next; 12 } 13 return; 14 } 15 ListNode* Delete(int val,ListNode* hd){ 16 ListNode* dummy=new ListNode(0); 17 dummy->next=hd; 18 ListNode* pre=dummy; 19 ListNode* cur=hd; 20 while(cur!=nullptr){ 21 if(cur->val==val){ 22 pre->next=cur->next; 23 delete cur; 24 break; 25 } 26 pre=cur; 27 cur=cur->next; 28 } 29 ListNode* newhead=dummy->next; 30 delete dummy; 31 return newhead; 32 } 33 int main(){ 34 ios_base::sync_with_stdio(false); 35 cin.tie(NULL); 36 int n,a,b; 37 cin>>n>>a; 38 ListNode* hd=new ListNode(a); 39 unordered_map<int,ListNode*>hash; 40 hash[a]=hd; 41 for(int i=1;i<n;i++){ 42 cin>>a>>b; 43 ListNode* ia; 44 ListNode* ib; 45 if(hash[a]==nullptr)ia=new ListNode(a); 46 else ia=hash[a]; 47 if(hash[b]==nullptr)ib=new ListNode(b); 48 else ib=hash[b]; 49 if(ib->next==nullptr) 50 ib->next=ia; 51 else{ 52 ia->next=ib->next; 53 ib->next=ia; 54 } 55 if(ia==hd) hd=ib; 56 hash[a]=ia; 57 hash[b]=ib; 58 } 59 int deleteval; 60 cin>>deleteval; 61 PrintList(Delete(deleteval,hd)); 62 return 0; 63 }
by:AlenaNuna