1.判斷是否有環
bool existcircle(listnode* head)
return false;
}
2.找環的起始位置
這個在紙上畫個環就能看出相遇的地方到起始位置與表頭到起始位置的距離是相等的。所以相遇後把乙個放到頭去再相遇就好了。
listnode* findcirclestart(listnode* head)
return pslow;
} pslow=pslow->next;
pfast=pfast->next;
if (pfast)
pfast=pfast->next;
} return null;
}
3.反轉鍊錶
listnode* reverselist(listnode* head)
listnode* newhead=guard->next;
delete guard;
gurad=0;
return newhead;
}
4.刪除中間節點
同樣用快慢指標即可。
void removemiddle(listnode*& head)
if ( ppre==null ) //head is middle
else
delete pslow;
pslow=0;
}
5.倒數第k個節點
listnode* findkthfromback(listnode* head,int k)
if ( k>0 )
return null;
listnode* pback=head;
while(pforward)
return pback;
}
鍊錶相關面試題
原文及參 題一 給定單鏈表,檢測是否有環。擴充套件 怎麼快速檢測出乙個巨大的鍊錶中的死鏈?或者如何找出乙個單鏈表的中間節點?題二 給定兩個單鏈表 head1,head2 檢測兩個鍊錶是否有交點,如果有返回第乙個交點。題三 給定單鏈表 head 如果有環的話請返回從頭結點進入環的第乙個節點。要點 如果...
鍊錶相關面試題(基礎篇)
鍊錶相關面試題 基礎篇 鍊錶是一種常見的基礎資料結構,是一種線性表,是一種物理儲存單元上非連續 非順序的儲存結構。鍊錶由一系列節點組成,節點可以在執行時動態生成。每個節點包括儲存資料元素的資料域和儲存下乙個節點位址的指標域兩個部分。相比於線性表順序結構,操作複雜。資料元素的邏輯順序也是通過鍊錶中的指...
鍊錶相關的熱點面試題(一)
先把相關的題目給出來 1.從尾到頭列印單鏈表 2.刪除乙個無頭單鏈表的非尾節點 3.在無頭單鏈表的乙個非頭節點前插入乙個節點 4.逆置 反轉單鏈表 5.單鏈表排序 6.合併兩個有序鍊錶,合併後依然有序 7.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 先把單鏈表結構給出來 templatet stru...