L2 022 重排鍊錶 三種方法

2021-10-02 12:11:00 字數 2179 閱讀 6310

思路

用位址做下標

查的時候直接用下標

再用乙個vector存順序弄好的鍊錶

再搞乙個node陣列放ans

開了兩個陣列 乙個vector

vector放中間結果 過度作用

mid和ans記住的都是id

mid是正常順序的 ans是亂序的

期間一直有個點不對 經過無數次的嘗試之後 。。。

md!!! 測試點3竟然是 第1個結點的位址在資料中沒有!!!沒有!!!dog…very dog

00100 1

00000 4 -1

#include

#include

using

namespace std;

struct node

;int

main()

// cout << endl;

//排序

while

(id !=-1

)//3 測試點

n = mid.

size()

;//ans出動

int a =

0, b = n -1;

int i =0;

//按題目的要求的順序

while

(a <= b)

}for

(int i =

0; i <

(i -1)

; i++

)//最後的單獨處理

printf

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

, ans[i -1]

, a1[ans[i -1]

].data)

;return0;

}

#include

#include

#include

#include

#include

using

namespace std;

intmain()

vectorint,

int>> v;

//先把正確的順序搞對

//往v裡加的 id和data

//next作為下乙個的索引

for(

int adr = a; adr !=-1

; adr = mp[adr]

.second)

//根據題目的排序

int s =

0, r = v.

size()

-1;while

(s < r)

//有可能是奇數

if(s == r)

cout <<

"-1\n"

;return0;

}

利用4個陣列

乙個是放資料 另外兩個是放左指標和右指標

剩下的是放拍完後的結果

#include

using

namespace std;

const

int max_n =

1e5+5;

//資料 右指標 左指標 題目順序

int v[max_n]

, n[max_n]

, p[max_n]

, a[max_n]

;int

main()

int eptr = hptr;

//雙向鍊錶

//n裡面放的是他右邊的指標

//p裡放的是他左邊的指標

for(

int j = n[eptr]

;~j; eptr = n[eptr]

, j = n[eptr]

)//現在eptr指的是最後乙個指標

// coutp[hptr]=-

1;int iptr, jptr;

for(iptr = hptr, jptr = eptr; iptr != jptr;)if

(iptr != jptr)

} a[jptr]=-

1;for(

int i = eptr;

~i; i = a[i]

)return0;

}

L2 022 重排鍊錶

給定乙個單鏈表 l1 l2 ln 1 ln,請編寫程式將鍊錶重新排列為 ln l1 ln 1 l2 例如 給定l為1 2 3 4 5 6,則輸出應該為6 1 5 2 4 3。每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的位址和結點總個數,即正整數n 105 結點的位址是5位非負整數,n...

L2 022 重排鍊錶

時間限制 500 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越給定乙個單鏈表 l1 l2 ln 1 ln,請編寫程式將鍊錶重新排列為 ln l1 ln 1 l2 例如 給定l為1 2 3 4 5 6,則輸出應該為6 1 5 2 4 3。輸入格式 ...

L2 022 重排鍊錶

l2 022 重排鍊錶 25分 給定乙個單鏈表 l 1 l 2 l n 1 l n 請編寫程式將鍊錶重新排列為 l n l 1 l n 1 l 2 例如 給定l為1 2 3 4 5 6,則輸出應該為6 1 5 2 4 3。每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的位址和結點總個數,...