数组模拟静态链表 双向链表

  1. #include <iostream>  
  2. using namespace std;  
  3. const int N=100010;  
  4.   
  5. //head 表示头节点的下标  
  6. //e[i] 表示i节点的值  
  7. //ne[i] 表示i节点的下一个节点的位置,即  
  8. //i节点的next指针是多少   
  9. //idex 存储当前已经用到了哪个点  
  10. int head,e[N],ne[N],idx;  
  11.   
  12. //初始化  
  13. void init()  
  14. {  
  15.     head=-1;  
  16.     idx=0;  
  17.  }   
  18.   
  19. //将x插入到头节点  
  20. void add_to_head(int x)  
  21. {  
  22.     e[idx]=x;//将x插入到当前节点   
  23.     ne[idx]=head;//将当前节点的下一个节点的  
  24.     //位置变为头节点指向的节点的位置   
  25.     head=idx;//头节点指向当前节点   
  26.     idx++;//当前节点已经用过   
  27.  }   
  28.  //将x插到下标是k的点的后面   
  29.  void add(int k,int x){  
  30.     e[idx]=x;  
  31.     ne[idx]=ne[k];  
  32.     ne[k]=idx;  
  33.     idx++;   
  34.  }  
  35.  //将下标是k的点的后面的点删掉  
  36.  void remove(int k){  
  37.     ne[k]=ne[ne[k]];  
  38.  }   
  39.  int main()  
  40.  {  
  41.     int m;  
  42.     cin>>m;  
  43.     init();  
  44.     while(m--){  
  45.         char x;  
  46.         cin>>x;  
  47.         if(x=='H'){  
  48.             int y;  
  49.             cin>>y;  
  50.             add_to_head(y);  
  51.          }  
  52.          else if(x=='D'){  
  53.             int y;  
  54.             cin>>y;  
  55.             if(!y)head=ne[head];  
  56.             remove(y-1);  
  57.          }  
  58.          else {  
  59.             int y,z;  
  60.             cin>>y>>z;  
  61.             add(y-1,z);  
  62.          }  
  63.      }  
  64.      for(int i=head;i!=-1;i=ne[i])  
  65.      cout<<e[i]<<" ";  
  66.      return 0;  
  67.  }  

 

双向链表

  1. #include <iostream>  
  2. using namespace std;  
  3. const int N=100010;  
  4. int m;  
  5. int e[N],l[N],r[N],idx;  
  6. //初始化  
  7. void init()  
  8. {  
  9.     //0表示左端点,1表示右端点  
  10.     r[0]=1,l[1]=0;  
  11.     idex=2;   
  12.  }   
  13.  //在下标是k的点的右边,插入x  
  14.  void add(int k,int x)  
  15.  {  
  16.     e[idx]=x;  
  17.     r[idx]=r[k];  
  18.     l[idx]=k;  
  19.     l[r[k]]=idx;  
  20.     r[k]=idx;  
  21.   }   
  22.   //删除第k个点   
  23.   void remove(int k)  
  24.   {  
  25.     r[l[k]]=r[k];  
  26.     l[r[k]]=l[l];  
  27.   }  
posted @   SaulGoodman1  阅读(23)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示