我知道这是一个常见问题解答,并且有很多答案,例如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;
}
最佳答案
开始于slowptr = head,fastptr = head-> next。在更新slowptr和fastptr之前先做两个比较。
如1)中所述,您不想删除支票。当(fastptr == slowptr || fastptr-> next == slowptr)时,就可以理解了。删除周期仅是更改指向slowptr的任何对象以指向空值的问题。您不需要(tail-> next == head)的特殊情况-试试吧。
第二个循环是多余的,永远不会中断。
要重申(没有双关语),打破循环,您需要更改
关于c - 我担心摆脱单链接列表的循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16432373/