給定乙個帶頭結點的單鏈表和乙個整數k,要求你將鍊錶中的每k個結點做一次逆轉。例如給定單鏈表 1→2→3→4→5→6 和 k=3,你需要將鍊錶改造成 3→2→1→6→5→4;如果 k=4,則應該得到4→3→2→1→5→6。
l是**給定的帶頭結點**的單鏈表,k是每段的長度。函式k_reverse應將l中的結點按要求分段逆轉。
思路:
首先遍歷鍊錶確定需要分段逆轉幾次(n/k)
建立兩個指標陣列儲存鍊錶結點位址
第乙個大小為k用於逆轉鍊錶
第二個大小為n/k用於儲存每一小段的頭結點,注意最後一段如果不需要逆轉的話也要把頭結點存入。
每一塊都逆置完成之後通過第二個陣列再進行一次遍歷使得段與段之間建立起聯絡(前一段的尾結點指向後一段的頭結點)
函式如下:
void
k_reverse
( list l,
int k )
ptrtonode head[n/k]
;//用於儲存每一段的頭結點
for(j=
0;j)//進行n/k次逆轉
for(i=k-
1;i>
0;i--
)//逆轉
head[j]
=x[k-1]
;//頭結點存陣列
} head[j]
=q;//如果最後一組不需要逆轉也要存入頭結點 如果正好全部逆轉則存入為null
for(j=
0;j)//段與段之間建立聯絡
m->next=head[j+1]
;}l->next=head[0]
;//l的頭結點指向head[0]
}
裁判測試程式
#include
#include
typedef
int elementtype;
typedef
struct node *ptrtonode;
struct node
;typedef ptrtonode list;
/* 定義單鏈表型別 */
list readinput()
;/* 裁判實現,細節不表 */
void
printlist
( list l )
;/* 裁判實現,細節不表 */
void
k_reverse
( list l,
int k )
;int
main()
/* 你的**將被嵌在這裡 */
PTA6 1單鏈表逆轉
list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l是給定單鏈表,函式reverse要返回被逆轉後的鍊錶。include include ...
3 5 單鏈表分段逆轉 20 分
給定乙個帶頭結點的單鏈表和乙個整數k,要求你將鍊錶中的每k個結點做一次逆轉。例如給定單鏈表 1 2 3 4 5 6 和 k 3,你需要將鍊錶改造成 3 2 1 6 5 4 如果 k 4,則應該得到 4 3 2 1 5 6。void k reverse list l,int k 其中list結構定義如...
3 5 單鏈表分段逆轉 20 分
給定乙個帶頭結點的單鏈表和乙個整數k,要求你將鍊錶中的每k個結點做一次逆轉。例如給定單鏈表 1 2 3 4 5 6 和 k 3,你需要將鍊錶改造成 3 2 1 6 5 4 如果 k 4,則應該得到 4 3 2 1 5 6。函式介面定義 void k reverse list l,int k 其中li...