給定乙個帶頭結點的單鏈表和乙個整數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結構定義如下:
typedef
struct node *ptrtonode;
struct node
;typedef ptrtonode list;
/* 定義單鏈表型別 */
l是帶頭結點的單鏈表,k是每段的長度。函式k_reverse應將l中的結點按要求分段逆轉。
#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()
/* 你的**將被嵌在這裡 */
612
3456
4
432
156
我們先來理一下解題的思路:
1.首先我們需要理解分段逆轉的意思,並不是題給例項那樣僅僅將鍊錶的前面k個資料逆轉了;而是,如果鍊錶資料個數遠大於k個是我們要把每k個資料都要逆置一下。比如我們輸入的是4,1,2,3,4,5,6,7,8,9,10,則輸出結果就為4,3,2,1,8,7,6,4,9,10。大家注意如果最後有不足k個的資料不需要逆置。
2.我們需要考慮一下程式的健壯性,就是寫這個程式時要考慮那些條件:
1.首先就要考慮k的正確性,當k小於0的時候當然時不行的;如果k等於1鍊錶不會發生
變化,所以我們可以將這種情況和k=0時放在一起,還有一種情況就是k的值大於
鍊錶資料總數時,鍊錶也不會變,所以這種情況也要排除。
2.我們要注意一下題目給的函式的宣告方式,他沒有給返回值,只給了兩個引數,乙個
是k,乙個是鍊錶的頭指標l。注意:這裡是指標,而不是指標的指標,也就是二級指標。
所以如果我們在新建乙個鍊錶head,把l逐個copy並分段逆置到head裡,在令l=head,
這樣做是不對的,因為我們對l進行改變不會影響到函式外面的改變。就像基本資料型別
傳遞一樣,所以我們只能在l的基礎上進行改變,即不能再新建頭指標。
這些都是我在寫的時候想到的一些情況,也許沒全,但是足以過題了。
3.看到這題我們第一時間就會想到雙重迴圈,所以這題理所應當的用雙重迴圈來寫,
下面我們就來看下**的具體操作順序;
//我們這裡就假設k為4;
void
k_reverse
( list l,
int k )
//判斷,如果總數小於k就不變鍊錶
if(count>=k)
end1 = end2;
//更新end1和end2
end2 = r;
}
end1->next = r;
//最後將尾節點next域置空。}}
}
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...
4 1 單鏈表逆轉 20分
4 1 單鏈表逆轉 20分 本題要求實現乙個函式,將給定的單鏈表逆轉。list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l是給定單鏈表,函...
4 1 單鏈表逆轉 20分
本題要求實現乙個函式,將給定的單鏈表逆轉。函式介面定義 list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l是給定單鏈表,函式revers...