鍊錶中環的入口結點

2022-03-18 03:33:07 字數 1494 閱讀 3990

鍊錶中環的入口結點

題目描述

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

第一步兩個節點, 一快一慢, 若有環則相遇

當快慢節點相遇時, 慢結點走了x個節點, 快結點恰巧走了2x個節點, 2x = k*n + x, k為1, 2,..., 此時令其中乙個節點等於頭結點, 然後以相同速度移動兩個節點, 相遇時恰好為環的入口節點

class solution 

listnode *pnode1 = phead;

listnode *pnode2 = phead;

while ((nullptr != pnode2) && (nullptr != pnode2->next))

return pnode1;}}

return nullptr;

}};

利用快慢節點確定有無環若有則返回相交節點, 否則返回nullptr

然後利用相交節點確定環的中節點的個數n

再讓乙個節點指向頭結點, 乙個指標指向距頭結點第n個節點, 然後以相同速度同時移動兩個節點, 相遇時即為環的入口點

class solution 

listnode *pslow = phead->next;

if (nullptr == pslow)

listnode *pfast = pslow->next;

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

pslow = pslow->next;

//pfast = pslow->next; // 沒有判斷pfast移動後是否是空節點

pfast = pfast->next; // 需要判斷pfast是不是空節點

if (nullptr != pfast)

}return nullptr;

}listnode* entrynodeofloop(listnode* phead)

// 得到環節點的數目

listnode *ct = meetingnode;

int counts = 1;

while (ct->next != meetingnode)

// 確定環的入口

listnode *pnode1 = phead; // pnode1指向頭結點

listnode *pnode2 = phead; // pnode2先移動counts節點數目

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

while (pnode1 != pnode2)

return pnode1;

}};

/*

struct listnode

};*/

鍊錶中環的入口結點

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

鍊錶中環的入口結點

題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...

鍊錶中環的入口結點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路1 設環中結點數是n,環的入口位置是x 距離起點走多少步 用快慢指標p,q,q移動的速度是p的2倍,當兩個指標相遇時p走的步數是y,q走的步數是2y,q比p多走k個環的距離,即 2y y kn,則y kn。p距離環的入口點的距離為y x,此...