如何在遍历单链表时删除任意节点?

时间:2012-03-14 01:29:32

标签: c linked-list

我有一个带有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] - >空

我想我需要一种方法来删除重复的节点,因为我正在遍历列表,但我无法弄清楚如何。有人可以指导我如何实现这一目标吗?一些伪代码会很棒。感谢。

编辑:解决了我的问题。有关详细信息,请参阅答案......

1 个答案:

答案 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] - >空

伪码:

  1. 将第一个ID和值保存到变量中,即id = head-> id,val = head-> val;
  2. 虽然列表如果不为空,即head!= null;
  3. 将头部分配给当前指针,并将头部 - >接下来指向下一个指针,即currPtr = head; nextPtr =头戴式>接下来;
  4. 当我们使用下一个指针遍历列表时它不是空的,即nextPtr!= null;
  5. 将nextPtr指向的节点与id进行比较。

    如果它们相同,则将节点的值添加到val,即val + = nextPtr-> val。将当前下一个指针设置为指向下一个下一个指针,即currPtr-> next = nextPtr-> next。免费nextPtr。然后设置下一个指针指向当前下一个指针,即nextPtr = currPtr-> next。

    否则,将当前指针设置为下一个指针,将下一个指针设置为下一个下一个指针,即currPtr = nextPtr; nextPtr = nextPtr->接着,

  6. 如果列表完全由下一个指针遍历,则平均值为val(如果需要可以添加到新列表中)。

  7. 删除第一个节点,现在指向旧列表中的下一个节点。
  8. 重复步骤2-7。
  9. 代码:

    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
    }