《劍指offer》面試題15:鍊錶中倒數第k個結點
魯棒(robust)/健壯性是指程式能夠判斷輸入是否合乎規範要求,並對不合要求的輸入予以合理的處理。
容錯性是魯棒性的乙個重要體現,不魯棒的軟體在發生異常事件時,會出現不可預見的詭異行為,或者整個軟體崩潰。
提高**魯棒性的有效途徑是進行防禦式程式設計,即預見在什麼地方可能會出現什麼問題,並問這些可能出現的問題制定處理方式。在面試時,最簡單也最實用的防禦性程式設計是在函式入口新增**以驗證使用者輸入是否符合要求。
鍊錶
輸入乙個鍊錶。輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數。即鍊錶的尾結點是倒數第1個結點。比如乙個鍊錶有6個結點。從頭結點開始它們的值依次是1。2。3,4,5,6.這個鍊錶的倒數第3個結點是值為4的結點。
鍊錶結點定義:
struct listnode;
為了實現只遍歷鍊錶一次就能找到倒數第k個結點,我們可以定義兩個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k-1。第二個指標保持不動;從第k步開始,第二個指標也開化寺從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k-1,當第乙個(走在前面的)指標到達鍊錶的尾指結點時,第二個指標正好是倒數第k個結點。
考慮魯棒性,有3種情況會導致**崩潰:
1)輸入的鍊錶為空;
2)輸入的鍊錶的結點總數小於k。由於在for迴圈中會在鍊錶上向前走k-1步,會由於空指標造成程式崩潰;
3)輸入的引數k=0。由於k是乙個無符號整數,那麼在for迴圈中k-1得到的將不是-1,而是無符號的0xffffffff。因此for迴圈執行的次數遠遠超出我們的估計,同樣也會造成程式崩潰。
// 《劍指offer——名企面試官精講典型程式設計題》**
// 著作權所有者:何海濤
#include "stdio.h"
#include "cstdlib"
struct listnode
;listnode* createlistnode(int value)
void connectlistnodes(listnode* pcurrent, listnode* pnext)
pcurrent->m_pnext = pnext;
}void printlistnode(listnode* pnode)
else }
void printlist(listnode* phead)
printf("\nprintlist ends.\n");
}void destroylist(listnode* phead)
}//***************===******************************************====
listnode* findkthtotail(listnode* plisthead, unsigned int k)
} pbehind = plisthead;
while (pahead->m_pnext != null)
return pbehind;
}// ********************測試**********************
// 測試要找的結點在鍊錶中間
void test1()
// 測試要找的結點是鍊錶的尾結點
void test2()
// 測試要找的結點是鍊錶的頭結點
void test3()
// 測試空鍊錶
void test4()
// 測試輸入的第二個引數大於鍊錶的結點總數
void test5()
// 測試輸入的第二個引數為0
void test6()
int main()
struct listnode
};class solution
while(pahead->next)
return pbehind;}};
當我們用乙個指標遍歷鍊錶不能解決問題的時候,可以嘗試用兩個指標來遍歷鍊錶。可以讓其中乙個指標遍歷的速度快一些(比如一次在鍊錶上走兩步),或者讓它先在鍊錶上走若干步。
#include #include //定義鍊錶結點型別
typedef struct listnode ;
listnode* findmidnode(listnode* phead)
if (phead->m_pnext == null || phead->m_pnext->m_pnext == null) //1個或2個結點
listnode *pfirstnode = phead;
listnode *psecondnode = phead;
while (pfirstnode->m_pnext != null && pfirstnode->m_pnext->m_pnext != null) //如果鍊錶結點數為偶數,輸出中間兩個結點前面的乙個。
#include #include //定義鍊錶結點型別
typedef struct listnode ;
bool isloop(listnode* head)
} if (fast->m_pnext = null) //沒有相遇,因而無環
return false;
}
劍指offer面試題15
面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...
劍指offer 面試題16 反轉鍊錶
題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...
劍指Offer面試題16 反轉鍊錶
反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...