劍指offer23 鍊錶中環的入口節點

2021-09-27 13:49:11 字數 2406 閱讀 9419

題目:如果乙個鍊錶中包含環,如何找出環的入口節點?例如,在下圖所示的鍊錶中,環的入口節點是節點3。

(1)判斷乙個鍊錶是否包含環?可以用兩個指標來解決這個問題,定義乙個慢指標和乙個快指標,這兩個指標同時從鍊錶的頭節點出發,慢指標一次走一步,快指標一次走兩步,如果快指標追上了慢指標,說明鍊錶就包含環,如果快指標走到了鍊錶的末尾都麼追上慢指標,說明鍊錶不包含環。

(2)如何找到環的入口?

定義兩個指標p1和p2指向鍊錶的頭節點,如果鍊錶中的環有n個節點,則讓指標p1先在鍊錶上向前移動n步,然後兩個指標以相同的速度向前移動,當指標p2指向環的入口節點時,指標p1已經圍繞著環走了一圈,又回到了入口節點。

(3)如何得到環中節點的數目?

在(1)中提到判斷乙個鍊錶是否包含環時用到了快慢指標,如果兩個指標相遇,說明鍊錶中存在環,兩個指標相遇的節點一定是在環中,因此可以從這個節點出發,一邊繼續向前移動一邊計數,當在次回到這個節點時,就可以計算出環中的節點數。

以題目中的例項為例,分析兩個指標的移動規律:

(1)指標p1和指標p2在初始化時都指向鍊錶的第乙個節點,如圖1所示;

(2)由於次環中有4個節點,所以指標p1先在鍊錶上向前移動4步,如圖2所示;

(3)接下來兩個指標以相同的速度在鍊錶上向前移動,直到它們相遇,它們相遇的結點正好是環的入口節點,如圖3所示。

具體**如下所示 :

#include #include using namespace std;

struct listnode

;void init(listnode* plisthead)

plisthead->next=null;

}static listnode* buynode()

bool inserttail(listnode *plisthead,int val)

listnode *pcur=plisthead;

while(pcur->next != null)

listnode *pnewnode=buynode();

pnewnode->value=val;

pcur->next=pnewnode;

return true;

}listnode* meetingnode(listnode* plisthead) //判斷鍊錶是否存在環,若存在返回環中的乙個節點,若不存在環,返回null

listnode *pslow=plisthead->next;

if(pslow == null)

listnode* pfast=pslow->next;

while(pfast != null && pslow != null)

pslow=pslow->next;

pfast=pfast->next;

if(pfast->next != null)

}return null;

}listnode *entrynodeofloop(listnode* plisthead) //找環的入口節點

int nodeinloop=1;

listnode* pnode1=meetingnode;

while(pnode1->next != meetingnode)

pnode1=plisthead;

for(int i=0;inext;

} listnode* pnode2=plisthead;

while(pnode1 != pnode2)

return pnode1; //返回環的入口節點

}int main()

listnode *plast=&plisthead;

while(plast->next != null)

listnode *pfirst=&plisthead; //pfirst指向頭節點

pfirst=pfirst->next; //pfirst->value=1;

pfirst=pfirst->next; //pfirst->value=2;

pfirst=pfirst->next; //pfirst->value=3;

plast->next=pfirst; //讓最後乙個節點指向第三個節點形成環

劍指offer23 鍊錶中環的入口節點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。兩個指標,p1,p2 p1一次走一步,p2一次走兩步。第一次相遇之後開始計數,第二次再相遇時count的值就是環有多少個節點。兩個指標,p1,p2 p1先走count步,然後兩個再同時走,相遇的點就是入口節點。struct l...

劍指offer23 鍊錶中環的入口節點

判斷單鏈表中有沒有環,如果有找到環的入口節點。三個問題 1 如何確定鍊錶中包含環 兩個指標,乙個指標一次走一步,乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,則說明鍊錶包含環 如果走得快的指標走到了鍊錶末尾 p next null 都沒有追上第乙個指標,則無環。2 如何找到環的入口 定義兩...

劍指offer 23 鍊錶中環的入口節點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出none。思路 1.找相遇點 設定乙個快指標pfast乙個慢指標pslow,先找到乙個相遇點,一定在環中 2.計算環的長度 從相遇點出發,到相遇點結束 1,即為環的長度。3.pfast 從phead 環的長度出發 pslow從phead...