23 鍊錶中環的入口結點

2021-10-03 04:43:23 字數 1100 閱讀 6628

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

題解:首先是確定鍊錶中有環,第二步是找到鍊錶的入口。

在確定是否有環的過程中,設定乙個快指標,乙個慢指標,快指標一次走兩步,慢指標一次走一步,如果兩個指標可以相遇,證明存在環。

在找鍊錶入口結點的過程中,定義兩個指標p1、p2指向鍊錶的頭結點. 如果環中有n個結點將p1先在鍊錶上向前移動n步,然後兩個結點同時前進,相遇點就是環的入口結點。

/*

struct listnode

};*/

class solution

listnode* loopnode = nodeinloop(phead);

if(loopnode == nullptr)

return nullptr;

listnode* firstloop = loopnode->next;

int count = 1;

// 統計環中的個數

while(loopnode != firstloop)

firstloop = phead;

listnode* end = phead;

// 前進n個點

while(count-- > 0)

while(end != firstloop)

return firstloop;

}//找到環中的結點

listnode* nodeinloop(listnode* phead)

listnode* lowpoint = phead;

listnode* fastpoint = nullptr;

if(phead->next != nullptr)

fastpoint = lowpoint->next;

else

return nullptr;

while(fastpoint != lowpoint && fastpoint != nullptr)

return fastpoint;

}};

23 鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。思路 1.判斷鍊錶中有環 2.得到環中節點的數目 3.找到環中的入口節點 public class solution if flag else l f phead for int i 0 i n i while l f ret...

23 鍊錶中環的入口結點

nowcoder 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。要求不能使用額外的空間。使用雙指標,乙個快指標 fast 每次移動兩個節點,乙個慢指標 slow 每次移動乙個節點。因為存在環,所以兩個指標必定相遇在環中的某個節點上。假設環入口節點為 y1,相遇所在節點為 z1。假設快指標 fast ...

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...