1015 反轉鍊錶 C

2021-08-21 07:06:46 字數 2171 閱讀 1009

題目

題目描述

給定乙個常數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個結點的位址、結點總個數正整數n(<= 105)、以及正整數k(<=n),即要求反轉的子鏈結點的個數。結點的位址是5位非負整數,null位址用-1表示。

接下來有n行,每行格式為:

address data next

其中address是結點位址,data是該結點儲存的整數資料,next是下一結點的位址

輸出描述:

對每個測試用例,順序輸出反轉後的鍊錶,其上每個結點佔一行,格式與輸入相同。

輸入例子:

00100 6 4

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

輸出例子:

00000 4 33218

33218 3 12309

12309 2 00100

00100 1 99999

99999 5 68237

68237 6 -1

解題思路

題目意思如下:

而每個結點的資訊有三個,一是本結點的位址、二是本結點的資料值、三是與該結點鏈結的下乙個結點的位址

當輸入n個結點資訊後,應當可以自動構造好鍊錶,然後再對構造好的鍊錶按題目要求進行反轉。

對於題目來說,我們可以通過構造靜態鍊錶來解題,即借助陣列來完成線性表的鏈式儲存

1、構造靜態鍊錶

建立兩個陣列,乙個陣列存放資料值(data[100005]),乙個陣列存放下乙個結點的位址(next(10005))

這樣一來遍歷鍊錶通過以下**,即可完成遍歷

2、遍歷鍊錶,將各個結點位址有序的存放到陣列 id[ ] 中去

這樣一來遍歷鍊錶通過以下**,即可完成遍歷

3、對陣列id每k個數進行反轉,總共需要反轉 id陣列長度(len)/k 組(這裡需要注意的是輸入的結點數n不一定是鍊錶的長度,因為可能存在重複的結點)

4、反轉完成後,遍歷陣列id[ ]有序輸出即可,輸出時注意格式要求

//部分**

//zhicheng

const

int maxn=100000;

int data[maxn],nex[maxn],id[maxn];

int main()

for(int cn=0,i=0;i//將參與翻轉的部分進行翻轉

reverse(id+cn,id+cn+k);

//有序輸出鍊錶中結點資訊,注意輸出格式

鋪子日常更新,如有錯誤請指正傳送門:**鏈結

題目鏈結

PAT 反轉鍊錶1015

反轉鍊錶 定義乙個node用來存放資料data和下一位址next,為了通過乙個節點的位址來找到這個節點,容易想到的辦法是讓這個位址就是他的陣列下標。所以在輸入節點時,先輸入節點的位址temp,再用vector來存放每次輸入的結點的資料傳data和下一節點的位址next 每k個節點呼叫一次revers...

PAT 1015 反轉鍊錶(25)

感覺這是30道真題裡最難的一道了,比其他25分的題主要難在它的陷阱太多,題目並沒有明確指出,用了好久才ac,看到所有測試點都不紅了,激動。經過多次嘗試,總結的陷阱主要有 1.看清題意!看清鍊錶如何反轉!2.首位址為 1的情況分類出來 3.輸出最後乙個節點是next必須為 1.4.輸入的節點中的無效節...

C 單向鍊錶反轉

根據我的理解,我這裡用到用到三個指標 假設有如下鍊錶 新建三個指標,資訊分別如下 head curr都指向list,而 temp指向乙個空塊 然後將curr移動到下一塊鍊錶,這時將head next指向temp 最後移動temp到head,再將head移動到curr,整個過程大概就這樣 如下 nod...