鍊錶相關筆試題 一

2021-07-11 13:08:37 字數 1641 閱讀 7860

1.從尾到頭列印單鏈表

方法一:可以用棧實現,遍歷鍊錶,每經過乙個結點,把該結點放入棧中,當遍歷完整個鍊錶後,從棧頂開始逐個輸出結點的值,此時輸出的結點的順序就反轉過來了

實現**:

void printtailtohead(listnode *phead)

while(!nodes.empty())

}

方法二:用遞迴實現,每訪問到乙個結點時,先遞迴輸出它後面的結點,再輸出該結點

實現**:

void printtailtohead(listnode *phead)

printf(" %d",phead->data);

}}

2.在o(1)時間刪除鍊錶結點

實現**:

void delete(listnode*& phead, listnode* pdelnode)

if (pdelnode->next != null)

else if (phead == pdelnode)

else

cur->next = null;

delete pdelnode;

pdelnode = null;

}}

3.鍊錶中倒數第k個結點

方法一:遍歷鍊錶兩次,第一次統計出煉表中結點的個數,第二次就能找到倒數第k個結點

方法二:定義兩個指標,第乙個指標從鍊錶的頭開始遍歷向前走k-1,第二個指標保持不動,從第k步開始,第二個指標也開始從鍊錶的頭開始遍歷,當第乙個指標到達鍊錶的尾時,第二個指標正好是倒數第k個結點

實現**:

listnode* findkthtotail(listnode* plisthead, unsigned int k) 

listnode *fast = plisthead;

listnode *slow = plisthead;

k = k-1;

while(k--)

else

}while(fast->next)

return slow;

}

4.反轉鍊錶

實現**:

listnode* reverselist(listnode* phead) 

return newhead;

}

5.合併兩個排序的鍊錶

實現**:

listnode* merge(listnode* phead1, listnode* phead2)

else if(phead2 == null)

listnode* newhead = null;

if(phead1->val < phead2->val)

else

listnode* cur = newhead;

while(phead1 && phead2)

else

}if(phead1 != null)

else if(phead2 != null)

return newhead;

}

鍊錶相關面試題

原文及參 題一 給定單鏈表,檢測是否有環。擴充套件 怎麼快速檢測出乙個巨大的鍊錶中的死鏈?或者如何找出乙個單鏈表的中間節點?題二 給定兩個單鏈表 head1,head2 檢測兩個鍊錶是否有交點,如果有返回第乙個交點。題三 給定單鏈表 head 如果有環的話請返回從頭結點進入環的第乙個節點。要點 如果...

鍊錶相關的熱點面試題(一)

先把相關的題目給出來 1.從尾到頭列印單鏈表 2.刪除乙個無頭單鏈表的非尾節點 3.在無頭單鏈表的乙個非頭節點前插入乙個節點 4.逆置 反轉單鏈表 5.單鏈表排序 6.合併兩個有序鍊錶,合併後依然有序 7.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 先把單鏈表結構給出來 templatet stru...

各種面試題 鍊錶相關

1.判斷是否有環 bool existcircle listnode head return false 2.找環的起始位置 這個在紙上畫個環就能看出相遇的地方到起始位置與表頭到起始位置的距離是相等的。所以相遇後把乙個放到頭去再相遇就好了。listnode findcirclestart listn...