煉表面試考試常用題

2021-12-30 05:00:58 字數 1990 閱讀 5623

//1.判斷是否帶環

linklist* hascircle(linklist*node)

if (slow == fast)//快慢指標相遇——帶環

}//2.求環長

size_t getcirclelength(linklist*pmeetnode)

return length;

}//3.求環入口點

//從起點和相遇點出發,再相遇時就是入口點

linklist*cetentrancenode(linklist*node, linklist*pmeetnode)

return cur;//兩者相遇時,跳出迴圈,此時的相遇點就是入口點

}如何求環的入口點呢?

不帶環鍊錶相交方式:

//1.定義兩個指標,cur1和cur2,分別遍歷兩個鍊錶,當兩個指標相等時,則兩個鍊錶相交

int linklistiscrossnode(linklist*list1, linklist*list2)

while (cur2 != null)

if (cur1 == cur2)

else

}//上述情況是在預設兩個鍊錶長度一樣的基礎上進行操作的

//如果兩個鍊錶長度不等,它們之間必定有乙個差值k,讓長的鍊錶先遍歷,

//指向長鍊表的指標走完k個節點之後,兩個鍊錶再同時遍歷

//2.所以需要先計算兩個鍊錶的長度

int getlistlength(linklist*node)

return length;

}//3.移動鍊錶,開始進行判斷,是否相交,找交點

linklist* movetocrossnode(linklist*longlist, linklist*shortlist, size_t gap)

while (longlist != null)

}return null;

}//4.求交點

linklist*getcrossnode(linklist*list1, linklist*list2)

else

return crossnode;

}1.兩個都不帶環——轉換為第十二題

2.乙個帶環,乙個不帶環(一定不相交)

3.兩個都帶環(3種情況)

1)不相交

2)環內相交——入口點不同

3)環外相交——入口點相同

利用兩個相遇點判斷是否帶環(若帶環,快慢指標相遇)

利用兩個相遇點來判斷是否相交(兩個相遇點m1 m2,m1不動,m2走一圈,若相遇,則相交)

帶環鍊錶相交情況:

//1.判斷帶環鍊錶是否相交以及相交情況

int linklistringiscrossnode(linklist*list1, linklist*list2)

if (pmeetnode1 != null&& pmeetnode2 == null)//乙個帶環,乙個不帶環

else//兩個都帶環

else//環外相交

}cur = cur->_next;

}return - 1;//不相交

}}//2.獲取相交點

linklist*getringcrossnode(linklist*list1, linklist*list2)

else if (result == -1)//不相交

else if (result == 2)//環外相交

//若是環內相交,環中所有的點相同

return crossnode;

}

煉表面試指南

1.鍊錶問題的演算法難度不高,但是考察 實現能力。2.鍊錶和陣列都是一種線性結構 組是一段連續的儲存空間 鍊錶空間不一定保證連續,為臨時分配的。只能從鍊錶頭部開始乙個個往下走,不能直接定位到i結點。鍊錶分類 連線方向 單鏈表 雙鏈表 有環無環 普通鍊錶 環形鍊錶 普通環形鍊錶 迴圈鍊錶 鍊錶問題 實...

mysql 雙向鍊錶 面試 雙向鍊錶

面試遇到乙個題目,寫乙個雙向鍊錶,包括新增,刪除,查詢和遍歷。當時寫了一塌糊塗,後來自己都覺得想笑,雙向寫著寫著被我寫成了單向不像單向,雙向不像雙向了,真是不倫不類。之後 我把這個問題整理了一下,希望對以後的小夥伴 有幫助。如果有錯誤,希望指出 以免誤人。謝謝!public class linkno...

LeetCode 鍊錶 面試題 反轉鍊錶

題目 於 leetcode 上第 206號 reverse linked list 問題 反轉乙個單鏈表。題目難度為 easy。題目描述 reverse a singly linked list.反轉乙個單鏈表 input 1 2 3 4 5 null output 5 4 3 2 1 null 複...