//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 複...