我知道这是一个常见问题解答,并且有很多答案,例如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/

10-10 10:01