我知道这是一个常见问题解答,有许多答案,例如Interview: Remove Loop in linked list - Java。但我有以下顾虑。如果我错了,请指出,请您指点一个正确答案的链接?
if (fast_ptr==slow_ptr || fast_ptr->_next == slow_ptr)
更改为if (fast_ptr==slow_ptr)
;因为只有一个入口点。 这是我的代码:
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;
}
答案 0 :(得分:0)
从slowptr = head,fastptr = head->下一步开始。在更新slowptr和fastptr之前进行两次比较。
您不想删除支票,正如您在1)中所述。当你知道(fastptr == slowptr || fastptr-> next == slowptr)时,你就有了这个循环。删除循环只是改变指向slowptr指向null的任何一个问题。你不需要特殊情况(tail-> next == head) - 尝试一下。
第二个循环是多余的,永远不会破坏。
重申(没有双关语),打破周期,你改变
答案 1 :(得分:0)
bool determine_remove_Cycle_list_2(sIntElement *head){
sIntElement* slow_ptr = head;
if (!head) return false;
sIntElement* fast_ptr = head->_next;
while(true){
if (!fast_ptr || !(fast_ptr->_next)) return false;
if (fast_ptr==slow_ptr || fast_ptr->_next == slow_ptr)
break; //find the cycle
else {
slow_ptr = slow_ptr->_next;
fast_ptr = fast_ptr->_next->_next;
}
}
//slow is at position p here.
fast_ptr = head;
while(fast_ptr->_next != slow_ptr->_next){
fast_ptr = fast_ptr->_next;
slow_ptr = slow_ptr->_next;
}
slow_ptr->_next = NULL;
return true;
}