資料結構 劍指offer 輸出鍊錶倒數第k個結點

2021-08-19 22:59:15 字數 1087 閱讀 8804

題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

本題考查的是**的魯棒性,所謂的魯棒性是指程式能夠判斷輸入是否合乎規範要求,並對不符合要求的輸入予以合理的處理。容錯性是魯棒性的乙個重要體現。提高**魯棒性的有效途徑是進行防禦性程式設計。

思路:首先要判斷k值的大小,k的大小為0的話直接返回空,同時k的大小不能超過鍊錶的長度。除此之外,也要注意原始的鍊錶是否為空鍊錶。 如果要求只遍歷一次鍊錶:定義兩個指標p1和p2,第乙個指標從頭節點開始往前走k-1步,第二個指標保持不變;從第k步開始,第二個指標也從頭節點開始向後遍歷。兩個指標的距離始終保持在k-1,所以當第乙個指標指向最後乙個節點時,第二個指標剛好指向倒數第k個指標。

拓展:當 用乙個指標遍歷鍊錶不能解決問題的時候,可以嘗試用兩個指標來遍歷鍊錶,可以讓其中乙個指標遍歷的速度快一些,或者讓它在鍊錶上走若干步。eg:求鍊錶的中間節點。如果鍊錶中的節點總數為奇數,則返回中間節點,如果鍊錶中的節點總數為偶數,則返回中間兩個節點的任意乙個。可以定義兩個指標,同時從鍊錶的頭節點出發,乙個指標一次走一步,乙個指標一次走兩步。當走的快的指標走到鍊錶的末尾時,走得慢的指標正好在鍊錶的中間。

class solution 

listnode *pahead = plisthead;

listnode *pbehind = nullptr;

for(unsigned int i =0;inext != nullptr)

else

}pbehind = plisthead;

while(pahead -> next != nullptr)

return pbehind;

}};

還想到了一種方法:先把鍊錶翻轉,再輸出第k個結點。但執行結果有問題:

class solution 

return pnewnode;

}private:

listnode* reverselist(listnode* phead)

};

報錯error:

段錯誤:您的程式發生段錯誤,可能是陣列越界,堆疊溢位(比如,遞迴呼叫層數太多)等情況引起

case通過率為0.00%

劍指offer 逆向輸出鍊錶

輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個節點的值 解法二 使用棧的 先進後出 特點,從頭到尾遍歷的過程中依次入棧,再從棧中取出元素輸出。需要借助棧的儲存結構。實現 public static void printnode node node while stack.isempty 解法三 根據...

劍指offer 鍊錶

單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...

劍指offer 鍊錶

鍊錶 鍊錶是一種動態資料結構 struct listnode 往鍊錶的末尾新增乙個節點的c 程式如下 void addtotail listnode phead,int value 注意第乙個引數phead是乙個指向指標的指標。當我們往乙個空鍊錶插入乙個結點時,else pnode m pnext ...