**:
給定乙個單鏈表,只給出頭指標h:
1、如何判斷是否存在環?
2、如何知道環的長度?
3、如何找出環的連線點在**?
4、帶環鍊錶的長度是多少?
解法:
1、對於問題1,使用追趕的方法,設定兩個指標slow、fast,從頭指標開始,每次分別前進1步、2步。如存在環,則兩者相遇;如不存在環,fast遇到null退出。
2、對於問題2,記錄下問題1的碰撞點p,slow、fast從該點開始,再次碰撞所走過的運算元就是環的長度s。
3、問題3:有定理:碰撞點p到連線點的距離=頭指標到連線點的距離,因此,分別從碰撞點、頭指標開始走,相遇的那個點就是連線點。(證明在後面附註)
4、問題3中已經求出連線點距離頭指標的長度,加上問題2中求出的環的長度,二者之和就是帶環單鏈表的長度
#includeusing namespace std;
#define maxsize 100
typedef struct node
node,*llink;
void isloop(llink head)
} if(!loop)
cout<<"this link has not loop\n";
else
while(p!=r);
--loopcount;
while(p!=q)//得到環的入口結點,同時計算得到非環的結點數
--nonloop;
cout<<"\nstart of loop: "return !(fast == null || fast->next == null);
}
//尋找環連線點(入口點)的程式:
llink findloopport(llink head)
if (fast == null || fast->next == null)
return null;
slow = head;
while (slow != fast)
return slow;
} //亦可以用類似與hash表的方法,即設立乙個陣列,將鍊錶結點中的值做陣列下標,當賦值衝突時就是環的接入點
bool isloop(llink p)
return false;
}llink findnode(llink head,int n)//找出鍊錶中的第n個結點
llink creatlinkloop()
//建立乙個有環的鍊錶
else break;
} llink tmp=findnode(head,4);//隨機產生環的接入點
q->next=tmp;
// coutwhile(head->next)
cout}int main()
判斷乙個單鏈表是否有環及環
判斷乙個單鏈表是否有環及環的鏈結點 蒙恩的罪人 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩...
判斷乙個單鏈表是否有環及環入口
要求 不允許修改鍊錶結構 時間複雜度o n 空間複雜度o 1 判斷是否有環 如果鍊錶有環,那麼在遍歷時則會陷入死迴圈。使用快慢指標 快指標移動2步,慢指標移動1步 如果走到某一步,快慢指標相遇,則說明有環 環入口點 我們假設鍊錶頭部到環入口距離 len,環入口到快慢指標交匯點的距離為x,環的長度為r...
判斷乙個單鏈表是否有環
一 判斷鍊錶是否存在環 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入 環,而slow後進入環,兩個指標必定相遇。當然,fast先行頭到尾部為null,則為無環鏈表 程式如下 bool i itsloop listn...