我有一个带有x个节点的单链表,其中一些节点是重复的。我需要在遍历列表时删除重复项,因此我最终得到一个仅包含唯一节点的新列表。但是,我还需要计算所有重复项的平均值,以便唯一列表将包含这些平均值。
示例1: 说我有这样的列表: a [1] - > b [2] - > c [3] - > a [2] - > a [3] - > b [2] - >空
遍历列表后,我应该最终得到这个列表: a [2] - > b [2] - > c [3] - >空
示例2: 说我有这样的列表: a [2] - > a [2] - > a [5] - > b [2] - > b [4] - > c [3] - >空
遍历列表后,我应该最终得到这个列表: a [3] - > b [3] - > c [3] - >空
我想我需要一种方法来删除重复的节点,因为我正在遍历列表,但我无法弄清楚如何。有人可以指导我如何实现这一目标吗?一些伪代码会很棒。感谢。
编辑:解决了我的问题。有关详细信息,请参阅答案......
答案 0 :(得分:0)
我发现了如何解决我的问题。如果其他人在将来遇到同样的问题,请分享。
总结一下,问题如下:我有一个包含x个节点的单链表(x是任意的)。每个节点都有两个字段,即id和value。在该列表中,一些节点是重复的,即它们具有相同的id。每个id的重复数量也是任意的。我需要删除所有重复项,同时平均它们的值。最后,我应该得到一个只包含唯一ID节点(及其各自的平均值)的列表。唯一节点的数量也是任意的(事先不知道)。
示例1:之前:a [1] - > b [2] - > c [3] - > a [2] - > a [3] - > b [2] - >空值。之后:a [2] - > b [2] - > c [3] - >空
示例2:之前:a [2] - > a [2] - > b [6] - > b [2] - > b [4] - >空值。之后:a [2] - > b [4] - >空
伪码:
将nextPtr指向的节点与id进行比较。
如果它们相同,则将节点的值添加到val,即val + = nextPtr-> val。将当前下一个指针设置为指向下一个下一个指针,即currPtr-> next = nextPtr-> next。免费nextPtr。然后设置下一个指针指向当前下一个指针,即nextPtr = currPtr-> next。
否则,将当前指针设置为下一个指针,将下一个指针设置为下一个下一个指针,即currPtr = nextPtr; nextPtr = nextPtr->接着,
如果列表完全由下一个指针遍历,则平均值为val(如果需要可以添加到新列表中)。
代码:
struct node {
char id[32];
int val;
struct node *nextNode;
};
void deleteNode(struct node **startPtr) {
struct node *currentPtr = *startPtr;
*startPtr = currentPtr->nextNode;
free(currentPtr);
}
.... //other functions
int main () {
...
char id[32];
int val, cnt;
struct node *head = NULL, *currPtr, *nextPtr;
.... //ask user to input the list
while (head!=NULL) {
strcpy(id,head->id);
val = head->val;
cnt = 1;
nextPtr = head->nextNode;
currPtr = head;
while (nextPtr != NULL) {
if (strcmp(nextPtr->id,id)==0) {
val += next->val;
cnt++;
currPtr->nextNode = nextPtr->nextNode;
free(nextPtr);
nextPtr = currPtr->nextNode;
} else {
currPtr = nextPtr;
nextPtr = nextPtr->nextNode;
}
}
deleteNode(&head);
printf("Node: %s, Value: %d\n",id,val/cnt); //or save into another list
}
.... //do other things
}