我担心从单链接列表中摆脱循环

时间:2013-05-08 03:56:11

标签: c algorithm

我知道这是一个常见问题解答,有许多答案,例如Interview: Remove Loop in linked list - Java。但我有以下顾虑。如果我错了,请指出,请您指点一个正确答案的链接?

  1. 如果您不仅要检测并删除周期,还应将if (fast_ptr==slow_ptr || fast_ptr->_next == slow_ptr)更改为if (fast_ptr==slow_ptr);因为只有一个入口点。
  2. 如果头部入口应考虑的情况。即,情况:1-> 2-> 3-> 4-> 1-> 2-> 3-> 4 ...,我从未看到任何链接显示这种情况。我错了吗?
  3. 这是我的代码:

    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;    
    }
    

2 个答案:

答案 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;
}