【问题标题】:Recursively removing the duplicate elements in a linked list递归删除链表中的重复元素
【发布时间】:2019-08-17 18:22:36
【问题描述】:

我试图使用递归概念删除排序链表中的重复元素。

我想看看如何删除排序链表中的元素。我编写了一个代码,其中如果head->data == head->next->datahead->next 应该被释放,直到我们得到不同的元素。 现在我做了很多改变,我很困惑我应该怎么做。它正在删除每个重复的值,只留下只出现在整个代码中的那个。

还请告诉我为什么这段代码会这样做,以及代码会出现什么问题,以及是否有任何最佳方式可以做同样的事情。

(我只提供deleteduplicate函数,如果需要提供整个代码,比如打印列表或插入到列表中,如果被告知我会编辑它)。

谢谢。

Node *deleteDuplicates(Node *head) { 
    if (head == NULL || head->next == NULL) {
        return head;
    }
    if (head->data == head->next->data) {
        struct Node *x = head->next;
        head->next = head->next->next;
        free(x);
        return deleteDuplicates(head);
    } else
        return deleteDuplicates(head->next);
} 

输入:11 11 11 13 13 20

输出:20

预期输出:11 13 20

【问题讨论】:

    标签: c recursion linked-list


    【解决方案1】:

    删除所有重复的值,只留下只出现在整个代码中的一个值。

    没有。它只删除重复值,但您总是返回指向最后一个节点的指针。

    if(head==NULL ||head->next==NULL){
       return head;
    }
    

    您不需要返回新的头部,因为只会删除重复的头部,所以头部不会改变。

    【讨论】:

      【解决方案2】:

      这个函数不需要递归。只需在循环中迭代,要么删除下一个元素,要么跳到下一个元素:

      Node *deleteDuplicates(Node *head) {
          if (head != NULL) {
              Node *p = head;
              while (p->next) {
                  if (p->next->data == p->data) {
                      Node *x = p->next;
                      p->next = x->next;
                      free(x);
                  } else {
                      p = p->next;
                  }
              }
          }
          return head;
      }
      

      您可以修复递归函数,但应该修改它以不返回头节点,因为这会阻止尾递归,因此可能需要大量的堆栈空间。足够长的列表会导致堆栈溢出

      这是一个修改后的递归函数:

      void deleteDuplicates(Node *head) { 
          if (head != NULL && head->next != NULL) {
              if (head->data == head->next->data) {
                  struct Node *x = head->next;
                  head->next = x->next;
                  free(x);
                  deleteDuplicates(head);
              } else {
                  deleteDuplicates(head->next);
              }
          }
      }
      

      您的代码中的问题是您将deleteDuplicates 的返回值存储到您的head 指针中,但该函数返回指向列表中最后一个节点的指针,而不是头节点。

      【讨论】:

        猜你喜欢
        • 2021-05-29
        • 2017-08-22
        • 1970-01-01
        • 2014-05-02
        • 2022-11-14
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多