นี่เป็นคำถามทดสอบข้อเขียนแบบคลาสสิกของ Microsoft ตัวชี้ทั้งสอง h1 และ h2 สำรวจรายการที่เชื่อมโยงกันตั้งแต่ต้นจนจบ h1 เคลื่อนที่ไปข้างหน้า 1 ก้าวในแต่ละครั้ง และ h2 เคลื่อนที่ไปข้างหน้า 2 ก้าวในแต่ละครั้ง แสดงว่า ไม่มีวงแหวน ; หาก h2 สัมผัส h1 ที่ควรอยู่ด้านหลัง แสดงว่ามีการวนซ้ำอยู่ (นั่นคือ เกิดการวนซ้ำ)
หากไม่มีวงแหวน h2 ต้องพบ NULL ก่อน:
หากมีวงแหวนอยู่ h2 และ h1 จะบรรจบกันอย่างแน่นอน และจุดนัดพบอยู่ภายในวงแหวน: h2 จะเดินทางเร็วกว่า h1 และจะไม่พบกันที่จุดเริ่มต้นของรายการที่เชื่อมโยงที่ไม่ใช่วงแหวน ดังนั้นเมื่อ h1 และ h2 เข้าสู่ทั้งคู่ วงแหวน ในที่สุด การเคลื่อนที่ของ h2 แต่ละครั้งจะลดช่องว่างระหว่าง h2 และ h1 ในทิศทางไปข้างหน้าลง 1 ในที่สุด ช่องว่างระหว่าง h1 และ h2 จะลดลงเหลือ 0 กล่าวคือ ทั้งสองมาบรรจบกัน
โมฆะคงที่สาธารณะ main (String args []) {
รายการ SingleList = รายการเดี่ยวใหม่ ();
สำหรับ(int i=0;i<100;i++){
รายการ.เพิ่ม(i);
-
System.out.print (SingleList.isExistingLoop (รายการ));
-
-
โหนดสาธารณะ (ค่าวัตถุ) {
this.data = ค่า;
-
โหนดสาธารณะ(){
this.data = โมฆะ;
this.next = โมฆะ;
-
-
โมฆะส่วนตัว init(){
นี่ขนาด = 0;
this.head = โหนดใหม่ ();
-
SingleList สาธารณะ () {
เริ่มต้น();
-
บูลีนสาธารณะประกอบด้วย (ค่าวัตถุ) {
ธงบูลีน = เท็จ;
โหนด p = head.next;
ในขณะที่(p!=null){
ถ้า(value.equals(p.data)){
ธง = จริง;
หยุดพัก;
}อื่น(
p = p.ถัดไป;
-
-
ธงส่งคืน;
-
เพิ่มบูลีนสาธารณะ (มูลค่าวัตถุ) {
ถ้า (มี (ค่า))
กลับเท็จ;
อื่น{
โหนด p = โหนดใหม่ (ค่า);
p.next=head.next;
head.next = p;
ขนาด++;
-
กลับเป็นจริง;
-
-