《劍指Offer》面試題15 鍊錶中倒數第k個結點

2021-08-20 19:27:05 字數 3154 閱讀 7700

《劍指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節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...