#include #include using namespace std;
struct linknode;
typedef linknode* linklist;
void insertlist(linklist &list , int data)//插入(建立)鍊錶
else }
//circlestart是環的起點,circlelen是環的長度,binglen是柄的長度
//一。快慢指標判斷是否有環;
//二。如果有環,第一次相遇後,繼續按照21的步長走,再次相遇時,迴圈的次數即為環長
//三。第二次相遇後,p指向煉表頭list,然後p和q都以步長為1繼續走,直到p==q,走的步數即為柄長
//四。環長+柄長=鍊錶節點數
bool iscircle(linklist list, linklist &circlestart, int &circlelen, int &binglen)//判斷是否有環,如果有環,求出環的起點
if(p==q)//有環
//求環起點及柄長
binglen=0;
p=list;
while(p!=q)
circlestart=p;
return true;
} else //無環
return false;
}void main()
{ linklist first=null;
linklist startnode;
int circlelen=0;
int binglen=0;
insertlist(first,10);
insertlist(first,12);
insertlist(first,-11);
insertlist(first,45);
insertlist(first,23);
insertlist(first,75);
insertlist(first,66);
insertlist(first,82);
//無環
if(iscircle(first,startnode, circlelen, binglen))
cout<
p=p->next;
linklist q=first;
for(int i=1; i<=2; i++)
q=q->next;
p->next=q;
if(iscircle(first,startnode,circlelen, binglen))
cout<
執行結果:
有環鏈表的環起點
用兩個指標,乙個快指標一次走兩步,乙個慢指標一次走一步。快慢指標可以重合表示鍊錶有環,此時距離環起點的距離和起點距離環起點的距離相等。include bits stdc h using namespace std struct list list beginofcircle list p1,list...
有環單鏈表
單鏈表中可能存在環,那麼如何判斷單鏈表中是否有環呢?若單鏈表中存在環,怎麼樣確定環的位置?如果乙個單鏈表中存在環,在遍歷鍊錶時,一旦進入環,就開始迴圈遍歷環上的節點。如果只用乙個指標來遍歷單鏈表,我們無法判斷單鏈表中是否存在環。用兩個指標就可以完成這個任務。設有兩個指標p1,p2。初始時p1和p2均...
單鏈表是否有環問題
有很多種方式解決問題,我這裡只說一種方法 使用p q兩個指標,p每次向前走一步,q每次向前走兩步,若在某時候p q,則存在環,如圖 實現 include include define len 8 typedef struct node node t int has loop2 node t head...