PAT b1025 靜態鍊錶

2021-10-12 03:17:09 字數 1636 閱讀 7964

ahhhh回來啦!最近可能集中做一波題www

之前去淺嘗輒止了半天別的,現在學不下去了再回來做做題tvt

在看程杰老師的《大話資料結構》以及胡凡老師的《演算法筆記上級訓練實戰指南》,想多做點題鞏固一下我相當於沒有的資料結構基礎。【p.s.大話資料結構真的講的通俗易通,程杰老師是用好幾個生動的例子來分布講解乙個資料結構,我之前想的是能不能把資料結構具象化、模擬化,串成乙個完整的情景和故事講出來,還是有點難quq】

乍一看是很裸的模擬題,但是仔細想想挺難實現的。他給的輸入資料就很難處理,不是按照節點的順序輸入,因此不能用指標構建鍊錶。於是就順理成章地想到了靜態鍊錶。

靜態鍊錶是新學的知識。就和這道題的題意一樣,你把鍊錶節點不按順序存在陣列裡,然後在每個節點維護下乙個節點的位址。它除了這種特定的問題好像沒什麼應用場景,但是用陣列維護資訊的方法模擬指標鍊錶是一種很妙的想法。

但是這道題他給的位址是不連續的,而且分布在[00000 - 99999]這個區間內,我們用再給節點維護乙個order的資訊的方法,讓節點集中起來。順著節點位址遍歷一遍,給每個節點賦值order,再依據order在陣列裡排序。

這裡有個非常需要注意的點是輸入裡可能給你好幾條鍊錶,但是你只需要看起始節點所在的那一條,於是遍歷完之後我們需要給n重新賦值成這一條鍊錶的長度。

這個錯誤點如果是我自己的話絕對想不到,但是以後就需要注意鍊錶的題,會不會給你好幾條鍊錶,腦子裡就要記著。

但是這道題的翻轉要求,還和我們之前常見的插入和刪除要求有所不同。或者說這道題沒必要真的把節點換過來,我們只需要輸出資訊就可以了。就是算下乙個節點翻轉完了是哪個有點繁瑣,需要特別注意乙個塊翻轉完之後後面那個塊也會翻轉,所以每個塊最後乙個要額外注意。

再就是%05d輸出-1的時候會有問題…需要特判…

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

100003

;struct node

} n[maxn]

;bool

cmp(

const node &a,

const node &b)

intmain()

for(

int i =

0; i < maxn; i++

)int curadd = firstadd;

int count =0;

while

(curadd !=-1

) n = count;

sort

(n, n + maxn, cmp)

;// for (int i = 0; i < n; i++)

// int yu = n % k, shang = n / k;

for(

int i =

0; i < shang; i++)if

(i < shang -1)

else

printf

("%05d %d -1\n"

, n[n -1]

.add, n[n -1]

.data);}

}}return0;

}

PAT B 1025 反轉鍊錶

給定乙個常數 k 以及乙個單鏈表l,請編寫程式將l中每 k個結點反轉。例如 給定l為1 2 3 4 5 6,k 為3,則輸出應該為3 2 1 6 5 4 如果 k為4,則輸出應該為4 3 2 1 5 6,即最後不到 k 個元素不反轉。輸入格式 每個輸入包含1個測試用例。每個測試用例第1行給出第1個結...

PAT B1025 反轉鍊錶

給定乙個常數k以及乙個單鏈表l,請編寫程式將l中每k個結點反轉。例如 給定l為1 2 3 4 5 6,k為3,則輸出應該為3 2 1 6 5 4 如果k為4,則輸出應該為4 3 2 1 5 6,即最後不到k個元素不反轉。輸入格式 每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的位址 結點...

PAT B1025 反轉鍊錶

給定乙個常數 k 以及乙個單鏈表 l,請編寫程式將 l 中每 k 個結點反轉。例如 給定 l 為 1 2 3 4 5 6,k 為 3,則輸出應該為 3 2 1 6 5 4 如果 k 為 4,則輸出應該為 4 3 2 1 5 6,即最後不到 k 個元素不反轉。每個輸入包含 1 個測試用例。每個測試用例...