帶環單鏈表——題集(三)

帶環單鏈表——題集(三)

       今天分享一下與帶環單鏈表相關的題。分別爲:判斷鏈表是否帶環若帶環求環的長度若帶環求環的入口點;並計算以上每個問題的時間複雜度。其次是設計一個類不能被繼承;設計一個類只能在堆上創建對象;設計一個類只能在棧上創建對象

       判斷鏈表是否帶環;若帶環求環的長度;若帶環求環的入口點;計算以上每個問題的時間複雜度

源代碼:

#include<iostream>
using namespace std;
 
struct ListNode{
int val;
ListNode* next;
ListNode(int _val)
:val(_val)
,next(NULL)
{}
};
 
//判斷鏈表是否帶環;
bool Isloop(ListNode* l1,ListNode*& met){
ListNode* fast=l1;
ListNode* low=l1;
 
do{
int i=0;
while(i<2){//fast走兩步,low走一步,後再判斷是否相等。
if(fast->next != NULL){
fast=fast->next;
i++;
}
else{
return false;
}
}
low=low->next;
}while(fast != low);
met=fast;
return true;
}
 
//若帶環求環的長度;
int Looplength(ListNode* met){//判斷有環的前提下
int len=1;//met結點即目前環的長度爲一
ListNode* cur =met->next;
 
 
while(cur != met){
cur=cur->next;
len++;
}
 
return len;
}
 
//若帶環求環的入口點;
ListNode* LoopEnter(ListNode* l1,ListNode*& met){//判斷有環的前提下
ListNode* begin=l1;
ListNode* entrance = met;
 
while(begin != entrance){//從相遇點遍歷一遍
begin=begin->next;
if(begin == entrance) break;
entrance=entrance->next;
}
 
return entrance;
}
 
void Listtestloop(){//判斷鏈表是否帶環;若帶環求環的長度;若帶環求環的入口點;
ListNode lA1(1);
ListNode lA2(2);
ListNode lA3(3);
ListNode lA4(4);
ListNode lA5(11);
 
lA1.next = &lA2;
lA2.next = &lA3;
lA3.next = &lA4;
lA4.next = &lA5;
 
 
ListNode lB1(7);
ListNode lB2(3);
ListNode lB3(8);
ListNode lB4(4);
ListNode lB5(11);
 
lB1.next = &lB2;
lB2.next = &lB3;
lB3.next = &lB4;
lB4.next = &lB5;
lB5.next = &lB2;
 
ListNode* met=NULL;
bool flag = Isloop(&lA1, met);//判斷鏈表是否帶環;
if(flag){//鏈表帶環;
cout<<"Isloop(&lA1, met): "<<flag<<endl;
cout<<"met:"<<met->val<<endl;//由有環得到的相遇結點//很關鍵
cout<<"Looplength(met): "<<Looplength(met)<<endl;//若帶環求環的長度;
cout<<"LoopEnter(&lA1, met): "<<LoopEnter(&lA1, met)->val<<endl;//若帶環求環的入口點;
}
else{
cout<<"Isloop(&lA1, met): "<<flag<<endl;//鏈表不帶環;
cout<<"遍歷鏈表l1: ";
Printf(&lA1);
cout<<endl;
}
 
 
met=NULL;
flag = Isloop(&lB1, met);//判斷鏈表是否帶環;
if(flag){//鏈表帶環;
cout<<"Isloop(&lB1, met): "<<flag<<endl;
cout<<"met:"<<met->val<<endl;//由有環得到的相遇結點//很關鍵
cout<<"Looplength(met): "<<Looplength(met)<<endl;//若帶環求環的長度;
cout<<"LoopEnter(&lB1, met): "<<LoopEnter(&lB1, met)->val<<endl;//若帶環求環的入口點;
}
else{
cout<<"Isloop(&lB1, met): "<<flag;//鏈表不帶環;
Printf(&lB1);
cout<<endl;
}
}
 
int main(){
Listtestloop();//判斷鏈表是否帶環;若帶環求環的長度;若帶環求環的入口點;
 
system("pause");
return 0;
}

運行結果:

 

求解時間複雜度:


       由上可知,判斷鏈表是否帶環的時間複雜度爲O(N^2);若帶環求環的長度的時間複雜度爲:O(1);若帶環求環的入口點的時間複雜度爲O(N^2):。

       接下來是,設計一個類不能被繼承;設計一個類只能在堆上創建對象;設計一個類只能在棧上創建對象。

設計一個類不能被繼承

      1>將類的構造函數設爲private即可。

      2>在類中定義一個接口讓內部對象去調用構造函數。源代碼:

源代碼:

#include<iostream>
using namespace std;
 
//設計一個類不能被繼承;
class Exp{
private:
Exp(int val=0)
:a(val)
{
}
public:
static Exp getExp(int val){
return Exp(val);
}
 
void Print(){
cout<<"exp->"<<a<<endl;
}
int a;
};
 
//class exc:public Exp//不能繼承
//{
//public:
//exc(int val=1,int tmp=2)
//:b(tmp)
//{}
//int b;
//};
 
void testexp()
{
cout<<"類不能被繼承"<<endl;
Exp p=Exp::getExp(8);
p.Print();
p.a=4;
p.Print();
}
 
int main(){
testexp();//設計一個類不能被繼承;
 
system("pause");
return 0;
}

運行結果:

 

Exp類正常運行

 

exc類不能繼承Exp類,編譯不通過

設計一個類只能在堆上創建對象:

      1>將類的構造函數設爲private。

      2>在類中定義一個接口讓內部對象去調用構造函數。

源代碼:

#include<iostream>
using namespace std;
 
//設計一個類只能在堆上創建對象
class Exp1{
private:
Exp1(int val=0)
:a(val)
{
}
public:
static Exp1* getExp(int val){
return new Exp1;
}
void Print(){
cout<<"exp->"<<a<<endl;
}
int a;
};
 
void testexp()
{
cout<<"類只能在堆上創建對象"<<endl;
Exp1* p1=Exp1::getExp(8);
p1->a=2;
p1->Print();
}
 
int main(){
testexp();
 
system("pause");
return 0;
}

運行結果:

 

設計一個類只能在棧上創建對象。

      1>將類的構造函數設爲private。

      2>在類中定義一個函數返回臨時對象。

源代碼:

#include<iostream>
using namespace std;
 
//設計一個類只能在棧上創建對象。
class Exp2{
private:
Exp2(int val=0)
:a(val)
{
}
public:
static Exp2 getExp(int val){
return Exp2(val);
}
void Print(){
cout<<"exp->"<<a<<endl;
}
int a;
};
 
void testexp()
{
cout<<"類只能在棧上創建對象"<<endl;
Exp2 p1=Exp2::getExp(8);
p1.Print();
p1.a = 11;
p1.Print();
}
 
int main(){
testexp();
 
system("pause");
return 0;
}

運行結果:

 


       分享如上,如有錯誤,望評論斧正!望共同進步!各位洗洗睡吧!

發佈了72 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章