/*
判斷單鏈表是否有環,如果有,把指向環的開始指標返回;如果沒有環,返回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...