日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组模拟单链表acwing826. 单链表

發布時間:2025/4/5 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组模拟单链表acwing826. 单链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 單鏈表一道題
      • 數組模擬單鏈表模板
        • 初始化鏈表
        • 向表頭插入數
        • 在下標為k的節點的下一個位置插入節點
        • 刪除下標為k的節點的下一個節點

單鏈表一道題

單鏈表題目
實現一個單鏈表,鏈表初始為空,支持三種操作:

(1) 向鏈表頭插入一個數;

(2) 刪除第k個插入的數后面的數;這里翻譯成人話:刪除下標為k-1的節點的后面的數,因為下標從0開始

(3) 在第k個插入的數后插入一個數:在下標為k-1的節點后面插入一個數

現在要對該鏈表進行M次操作,進行完所有操作后,從頭到尾輸出整個鏈表。

注意:題目中第k個插入的數并不是指當前鏈表的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。

輸入格式
第一行包含整數M,表示操作次數。

接下來M行,每行包含一個操作命令,操作命令可能為以下幾種:

(1) “H x”,表示向鏈表頭插入一個數x。

(2) “D k”,表示刪除第k個輸入的數后面的數(當k為0時,表示刪除頭結點)。

(3) “I k x”,表示在第k個輸入的數后面插入一個數x(此操作中k均大于0)。

輸出格式
共一行,將整個鏈表從頭到尾輸出。

數據范圍
1≤M≤100000
所有操作保證合法。

輸入樣例:

10 H 9 I 1 1 D 1 D 0 H 6 I 3 6 I 4 5 I 4 5 I 3 4 D 6

輸出樣例:

6 4 6 5

難度:簡單
時/空限制:1s / 64MB
總通過數:4526
總嘗試數:6720
來源:模板題,AcWing

注意:head是頭結點,同時也是第一個節點,也就是說向表頭插入一個數就是插入到head。
比如想要在空鏈表表頭位置插入4個數:9,6,7,8

head: 0
head: 1
head: 2
head: 3
最后輸出鏈表:8 7 6 9

ac代碼

#include<iostream> using namespace std; const int maxn=1e5+10; int e[maxn],ne[maxn],head,idx;void init(){head=-1;idx=0; }//表頭插入節點 void add_to_head(int x){e[idx]=x;ne[idx]=head;head=idx;idx++; }//刪除下標為k的節點的后一個節點 void remove(int k){ne[k]=ne[ne[k]]; }//在節點下標為k的節點后面插入一個值為x 的節點 void insert(int k,int x){e[idx]=x;ne[idx]=ne[k];ne[k]=idx;idx++; }int main(){init();//此步勿忘int m;cin>>m;while(m--){char op;int k,x;cin>>op;if(op=='H'){cin>>x;add_to_head(x);}else if(op=='D'){cin>>k;if(!k) head=ne[head];//刪除頭結點remove(k-1);}else if(op=='I'){cin>>k>>x;insert(k-1,x);}}for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";cout<<endl;return 0;}

板子
需要注意的是:數組下標從0開始,也就是說,第k個插入的元素其下標為k-1.
另外:main函數里面勿忘init()函數

#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int e[maxn],ne[maxn],head,idx; //初始化 void init(){head=-1;idx=0; } //表頭位置插入 void add_to_head(int x){e[idx]=x,ne[idx]=head,head=idx++; }//刪除下標為k的節點的后一個節點 void remove(int k){ne[k]=ne[ne[k]]; }//在節點下標為k的節點后面插入一個值為x 的節點 void insert(int k ,int x){e[idx]=x,ne[idx]=ne[k],ne[k]=idx++; }

數組模擬單鏈表模板

定義
e[i]表示下標為i的節點的數值
ne[i]表示下標為i的節點的next的指針
head表示頭結點指向的位置
idx表示當前可用的節點的下標

初始化鏈表

head表示頭結點指向的位置,-1表示指向空集,即空的鏈表
idx表示當前可用的節點的下標,初始時為0,表示節點編號從0開始。

void init(){head=-1;idx=0; }

向表頭插入數

換句話說,新插入元素的后繼就是頭結點指向的位置ne[idx]=head。然后頭結點指向新的節點head=idx。當前可用的節點下標更新。

void add_to_head(int x){e[idx]=x;ne[idx]=head;head=idx;idx++; }

在下標為k的節點的下一個位置插入節點

//idx表示當前可用的節點位置 void insert(int k,int x){//x表示插入的數e[idx]=x;//數據域ne[idx]=ne[k];ne[k]=idx;idx++; }

刪除下標為k的節點的下一個節點

下標為k的節點的指針指向,下標為k的節點的后繼的后繼。

void remove(int k){ne[k]=ne[ne[k]]; }

總結

以上是生活随笔為你收集整理的数组模拟单链表acwing826. 单链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。