我正在练习可以在链表中找到冗余的代码。
例如:

输入


  777


输出值


  包含2个冗余


输入


  32182


输出值


  包含1个冗余


我正在努力在代码中实际跟踪冗余。我对链接列表进行了排序,然后假设我将创建2个指针,一个指针遍历链接列表的当前位置,另一个指针遍历链接列表的先前位置,如果它们等于count ++。但是我总是得到0个冗余。

在下面的代码中,我认为我的挑战主要在于countRedun()方法。


struct digit * insertAtFront(struct digit *start, struct digit * newDig){
    struct digit * ptr = start;
    newDig = start;
    return newDig;

}
struct digit * insertIntoSorted(struct digit *start, struct digit *newDig) {
    struct digit *ptr = start;
    struct digit *prev = NULL;
    while ((ptr!=NULL) && (ptr->num < newDig->num)) {
        prev = ptr;
        ptr = ptr->next;
    }
    if (prev == NULL) {
        start = insertAtFront(start, newDig);
    } else {
        prev->next = newDig;
        newDig->next = ptr;
    }
    return(start);
}

struct digit * sortedCopy(struct digit * start) {
    //! heap1=showMemory(start=348, cursors=[start, ptr, sortedStart, newDigit])
    //! heap2=showMemory(start=519, cursors=[start, newDigit, ptr, prev])
    struct digit *ptr = start;
    struct digit *sortedStart = NULL;
    struct digit *newDigit;

    if (start!=NULL) {
        sortedStart = createDigit(start->num);
        ptr = ptr->next;
    }
    while (ptr!=NULL) {
        newDigit = createDigit(ptr->num);
        sortedStart = insertIntoSorted(sortedStart, newDigit);
        ptr = ptr->next;
    }
    return(sortedStart);
}

int countRedun(struct digit * start){
    struct digit  *sorted, *ptr, *prev, * curr;
    ptr = start;
    prev = start;


    //sort linked list
    sorted = sortedCopy(start);
    int count = 0;

    while(ptr != NULL)
    {

        if(ptr->num == prev->num)
        {
        count++;
        }
    prev = ptr;
    ptr = ptr->next;
    }

}


我排除了要求用户输入的代码以及链接列表创建者方法,假设排序和计数方法是解决此问题的关键。

最佳答案

看起来sortedCopy创建了一个完整的新列表,但已排序。如果是这样,那么您需要重新排序:

ptr = start;
prev = start;


//sort linked list
sorted = sortedCopy(start);


与:

//sort linked list
sorted = sortedCopy(start);
ptr = sorted;
prev = sorted;


作为说明,您可能会更好:

 prev = NULL;
 while(ptr != NULL) {
    count += (prev && ptr->num == prev->num);
    prev = ptr;
    ptr = ptr->next;
}


否则,您的计数将永远相减一。

09-25 21:32