鍊錶 學習筆記

2022-07-06 16:12:12 字數 1753 閱讀 1964

目錄演算法理解

鍊錶的組成

演算法實現

板子題-解析

約瑟夫:luogu p1145

由於約瑟夫僅僅涉及到了鍊錶的刪除,所以這裡換一題:

題目描述

有n個人(編號1到n)排隊,一開始這n個人從1到n號順序排隊,接下來出現q次插隊,每一次為x號插入到了y號的後面,詢問最終結果。

輸入第一行兩個數字,代表\(n\),\(q\)

接下來\(q\)行,每行兩個數字\(x\),\(y\)代表\(x\)號插入到了\(y\)號的後面

輸出\(q\)次插入後的結果

樣例輸入

5 3

1 22 4

3 5

樣例輸出
1 4 2 5 3

提示

【樣例解釋】

原始資料:1 2 3 4 5

一次插隊:2 1 3 4 5

兩次插隊:1 3 4 2 5

三次插隊:1 4 2 5 3

\(1\leq n,q\leq100000\)

鍊錶其實就是一種資料結構,鍊錶的每乙個節點可以分成兩個區域,分別是資料域和指標域,資料域代表鍊錶的資料,可以是乙個變數或陣列,也可以是一堆變數(結構體)。而指標域就可以分為前驅和字尾。

struct node;//其實不一定要用指標(我也不用)
這裡就貼一張圖吧。預設資料域有乙個int型別的數字,並且帶有字首的鍊錶。

graph lr

a[鍊錶]-->b(頭指標)

a-->c(乙個節點)

d(最後乙個節點)-->e(尾)

其中尾一般就是nuul(空指標)或者是\(-1\)。

首先,為初賽的同學們說一下,鍊錶和陣列各有長處,沒有好壞,除非拿出一道具體的題目出來。

刪除鍊錶的刪除就不想陣列那麼麻煩,因為指標域有很大的好處,方法如下:(雙向鍊錶)

就這樣,**如下:

a[a[x].pre].nex=a[x].nex;

a[a[x].nex].pre=a[x].pre;//刪去x點

這裡就不怎麼需要順序。

插入插入就不畫圖了,你們應該懂,但是插入就需要順序了,這個很重要。**:

a[a[y].nex].pre=x;

a[x].nex=a[y].nex;

a[y].nex=x;

a[x].pre=y;

這裡吧x插在y的後面。

雖然從字面上來看,僅僅是插入,但是在插入之前,這個點要刪除掉,所以必須要用雙向鍊錶。

**::

#include#define maxn 100039

using namespace std;

int n,t;

struct nodea[maxn];

int head,x,y,i;

int main(){

scanf("%d%d",&n,&t);

for(i=2;iend.

學習筆記 鍊錶 鍊錶入門

重新學習程式語言日記,2011年12月29日 09 17分 定義乙個結構體 struct linkhead,p1,p2 首先定義了乙個結構體,結構體包括指標域,資料域。這個結構體就是你鍊錶裡面的節點。每個節點都包括了資料域,指標域。有了這麼乙個結構體。肯定就需要初始化這個結構體了。寫個函式來初始化鍊...

鍊錶學習筆記 順序鍊錶

順序鍊錶的主要思想就是使用乙個整型陣列來儲存資料的指標。在建立記憶體的時候如圖,用後面的陣列來儲存指標。大量使用 給void重新起個名字 封裝使用的資料j 讓其對使用者是透明的 typedef void seqlist typedef void seqlistnode seqlist seqlist...

鍊錶學習筆記 雙向鍊錶

這次 寫的是迴圈鍊錶,用的是節點連線。雙向鍊錶相比與一般鍊錶要注意的地方就是 頭部插入和尾部插入 不要進行空指標操作。非鍊錶尾部的處理 if next null node pre current 如果是在頭部插如 則沒有 前節點 if i 0 tlist lenght return 0 dlinkl...