我正在练习可以在链表中找到冗余的代码。
例如:
输入
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;
}
否则,您的计数将永远相减一。