這道題的題目可以描述為:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
typedef int datatype;
typedef struct listnode listnode;
//初始化
void listinit(listnode **ppfirst)
這道題的普通解題思路分為三步:
1.定義兩個指標forward和backward,forward從煉表頭的頭指標開始遍歷向前走k-1步,backward保持不動;
2.從第k步開始,第二個指標backward也開始從鍊錶的表頭開始遍歷;
3.由於兩個指標之間的距離保持在k-1,當指標forward到達尾結點時,backward正好指向倒數第看個結點;
**如下:
listnode * findtailk1(listnode *first, int k)
while (forward != null)
return backward;
}
同時我們應該注意到,在這個實現演算法中,如果輸入的k為0或輸入的以forward為頭結點的鍊錶結點數小於k,都會導致程式奔潰。所以,針對這些問題對演算法進行以下兩點改進:
1.如果輸入的k為0,直接返回null;
2.在第乙個while迴圈中加乙個if判斷條件,如果輸入的鍊錶的節點數小於k,返回null;
**如下:
listnode * findtailk2(listnode *first, int k)
while (k--)
else
}while (forward != null)
return backward;
}
劍指offer 22 鍊錶中倒數第k個節點
輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點。示例 給定乙個鍊錶 1 2 3 4 5,和 k 2.返回鍊錶 4 ...
劍指 Offer 22 鍊錶中倒數第k個節點
劍指 offer 22.鍊錶中倒數第k個節點 難度 簡單 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點。示例 給...
劍指 Offer 22 鍊錶中倒數第k個節點
劍指 offer 22.鍊錶中倒數第k個節點 難度簡單56收藏分享切換為英文關注反饋 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個...