判斷單鏈表是否有環

2021-07-04 06:32:52 字數 1881 閱讀 4954

/*

判斷單鏈表是否有環,如果有,把指向環的開始指標返回;如果沒有環,返回null

這個程式:設定兩個指標,乙個pslow,乙個pfast,pslow每次走一步,pfast每次走兩步,如果後面pslow->_next等於null了,但是pfast還沒有等於pslow,那麼不存在環

否則若pfast == pslow表明存在環

在確認存在環的基礎上重新設定,pori等於煉表頭指標,而pslow不變,兩者每次走一步,兩者再次相遇的時候必然是環開始的地方

輸入:5(鍊錶長度) 2(環的起始下標)

0 1 2 3 4(鍊錶中每個節點的元素)

輸出:有環

環的起始位址

環的長度3

*//*

關鍵:1 while(pnode1 != pnode2)//根據頭指標距離環形鍊錶起始節點的距離 = 碰撞點距離環形鍊錶起始節點的距離(注意是從碰撞點走到環形鍊錶起始節點,距離不能反過來),將指標1設立在

node;

//實在不想刪除節點,用靜態陣列

node nodearr[maxsize];

int _iindex;

node* createnode()

void buildcircularlist(node** phead,int* parr,int n,node* (*pfun)(),int icircleindex)

node* pnode,*pcurnode;

node* pcircularnode;

int icnt = 0;

for(int i = 0 ; i < n ; i++)

else

if(icircleindex == icnt)//如果找到這個環的起始節點,就記錄下來

}pcurnode->_next = pcircularnode;//將尾結點與指定節點下標連線起來,構成環,此時的尾結點起始就是pcurnode

}node* iscircularlist(node* phead)//判斷是否是環形鍊錶,如果是:返回第一次相遇的節點指標,否則返回null

} return null;

}node* findcircularbeginnode(node* phead,node* pfirstmeetnode)//尋找環形鍊錶的開始節點

node* pnode1 = phead;

node* pnode2 = pfirstmeetnode;

while(pnode1 != pnode2)//根據頭指標距離環形鍊錶起始節點的距離 = 碰撞點距離環形鍊錶起始節點的距離(注意是從碰撞點走到環形鍊錶起始節點,距離不能反過來),將指標1設立在

return pnode1;

}int circularlistlen(node* pmeetnode)//計算環形鍊錶的長度

return ilen;

}void process()

int ilistarr[maxsize];

for(int i = 0; i < ilen; i++)

memset(nodearr,null,sizeof(nodearr));

_iindex = 0;

node* head = createnode();

node** phead = &head;

buildcircularlist(phead,ilistarr,ilen,createnode,icircleindex);//構建環形鍊錶

node* pfirstmeetnode = iscircularlist(*phead);

node* pcircularbegnode;

if(pfirstmeetnode)

}}int main(int argc,char* argv)

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單鏈表是否有環

鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...