PTA 乙級 1025 反轉鍊錶 C 實現

2021-09-27 13:12:00 字數 2051 閱讀 5388

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

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

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

這個題目著實卡了我好久,是乙個鍊錶的k位反轉問題。

我是直接寫了乙個node結構,首先按照address位址把每一行的address、data、next儲存到這個node結構裡,然後再進行反轉操作。

一開始我是寫了乙個sort方法把這個儲存上的node進行乙個按照位址的排序,然後在反轉,但是寫sort的時候我用的for迴圈,並且迴圈條件是i=0,i這裡需要注意的一點就是,題目的輸入不一定是全部連續的,也就是說它給了n個結點但是不一定這n個都能連成乙個鍊錶(暴風哭泣(;´д`)ゞ

所以才有了這中間的那個while迴圈,只push進去連續的鍊錶。

然後再用乙個reverse反轉外加輸出。

我的reverse是自己寫的,分了三種情況(以1->2->3->4->5->6反轉為例):

當前結點的下乙個指向前乙個結點。

比如 4->3->2->1->5->6 反轉中的 4->3 3->2 2->1

該輪反轉結束的最後乙個並且指向下一輪反轉

比如 3->2->1->6->5->4 反轉中的 1->6

該輪反轉結束後存在下一輪不反轉

比如 4->3->2->1->5->6 反轉中的 1->5

該輪反轉結束後不存在下一輪不反轉

比如 3->2->1->6->5->4 反轉中4結束

可能還有別的分情況,然鵝我感覺這個比較清晰,不過用algorithm裡面的reverse(i,i+k)可以直接反轉。

然後輸出,就okk了。

#include

#include

#include

using

namespace std;

struct node};

void

print

(node &node)

// 輸出node

void

reverse

(vector

&node,

int reverse)

// 反轉+輸出}if

(len%reverse !=0)

// 輸出不反轉的

}int

main()

vector l;

int adr = h_address;

while

(true

)// 找出其中有效鍊錶

reverse

(l, rev)

;}

PTA 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 個測試用例。每個測試用例...

PAT 乙級 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 個測試用例。每個測試用例...

PAT 乙級 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 個測試用例。每個測試用例...