鍊錶中環的入口結點第一步兩個節點, 一快一慢, 若有環則相遇題目描述
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出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,此...