私はそれがFAQであることを知っており、インタビュー:リンクされたリストのループを削除する - Javaなどの多くの回答があります。しかし、次の懸念があります。私が間違っている場合は、指摘してください。正解のあるリンクに誘導してもらえますか?
- サイクルを検出するだけでなく削除したい場合は、;に変更
if (fast_ptr==slow_ptr || fast_ptr->_next == slow_ptr)
する必要があります。if (fast_ptr==slow_ptr)
入り口が一つしかないからです。 - 頭なら入るときのケースを考えるべき。つまり、1->2->3->4->1->2->3->4...、このケースを示すリンクは見たことがありません。私が間違っている?
これが私のコードです:
bool determine_remove_Cycle_list(sIntElement *head){
sIntElement* slow_ptr = head;
sIntElement* fast_ptr = head;
while(true){
if (!fast_ptr || !(fast_ptr->_next)) return false;
slow_ptr = slow_ptr->_next;
fast_ptr = fast_ptr->_next->_next;
if (fast_ptr==slow_ptr)//fast_ptr->_next == slow_ptr is not checked
break; //is cycle
}
fast_ptr = head;
while(fast_ptr->_next != slow_ptr->_next){
fast_ptr = fast_ptr->_next;
slow_ptr = slow_ptr->_next;
}
}
if (slow_ptr == head){ //special case: start of the cycle is head,
while (slow_ptr->_next != head){
slow_ptr = slow_ptr->_next;
}
slow_ptr->_next = NULL; //slow is the node before the start point
return true;
}