3 5 單鏈表分段逆轉 20 分

2021-09-27 23:41:33 字數 2017 閱讀 4601

給定乙個帶頭結點的單鏈表和乙個整數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...