【问题标题】:delete occurrences of an element given after its k-th occurrence in a linked liste删除链表中第 k 次出现后给定的元素的出现
【发布时间】:2020-08-13 16:41:54
【问题描述】:

我想编写一种算法,开始删除在第 k 次出现后给定的元素的出现,但我构建的算法删除了所有出现的元素! 我可以得到一些帮助来改进我的算法吗?提前致谢。

typedef struct list
{
    int data;
    struct list *next;
}list;
list * delete_2(list *head,int element,int k)
{
    list *previous,*temp,*new_head=head;  previous=temp=NULL;
    bool stop=true; int i=0;
    if(head == NULL) return NULL;
    while(head != NULL)
    {
        if(new_head->data == element && stop)
        {
            if(i>=k)
            {
                temp=head;
                new_head=head->next;
                head=new_head;
                free(temp);
            }
            else i++;
        }
        else if(head->data==element)
        {
            if(i>=k)
            {
                if(head->next==NULL)
                {
                    temp=head;
                    previous->next=NULL;
                    head=head->next;
                    free(temp);
                }
                else
                {
                    temp=head;
                    previous->next=previous->next->next;
                    head=head->next;
                    free(temp);
                }
            }
            else i++;
        }
        else
            {
                previous=head;
                head=head->next;
                stop=false;
            }
    }
        return new_head;
} 

【问题讨论】:

    标签: c algorithm linked-list iteration


    【解决方案1】:

    我不会将您在开始时拥有超过 k 个元素的情况与其他情况区分开来。只有 k == 0 且元素位于开头的情况。

    类似:

    #define MOVE_FORWARD do {
      previous = head;
      head = head->next;
    } while (0)
    
    list * new_head = head;
    list * previous = NULL;
    int i = 0;
    while (head != NULL)
    {
       if (head->data  == element)
       {
          if (i < k) {
             i++;
             MOVE_FORWARD;
          }
          else
          {
            if (previous == NULL)
               // we are on first element and k == 0
               // change new_head
               new_head = head->next;
            // Delete current element and move on
            list * tmp = head;
            MOVE_FORWARD;
            free(tmp);
          }
       }
       else
       {
          MOVE_FORWARD;;
       } 
    }
    return new_head;
    

    不确定它是否有效,但对我来说似乎更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2020-03-16
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      相关资源
      最近更新 更多