我知道这是一个常见问题解答,并且有很多答案,例如Interview: Remove Loop in linked list - 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;
}