【问题标题】:Finding the merge point of two singlyLinkedlist using an array which stores the address of each Node of linked list使用存储链表每个节点地址的数组查找两个singlyLinkedlist的合并点
【发布时间】:2020-01-01 16:44:31
【问题描述】:

问题是使用存储链表每个节点的地址值的数组来找到两个链表的合并点。

我尝试增加更改头指针的地址大小,但似乎对长链表没有帮助。

int findMergeNode(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    SinglyLinkedListNode **a;
    a=(SinglyLinkedListNode**)malloc(200*sizeof(SinglyLinkedListNode));
    int i=0;
    while(head1){
      a[i]=head1;
      head1=head1->next;
      i++;
    }
    while(head2){
     SinglyLinkedListNode *p=head2;
     for(int j=0;j<i;j++){
        if(a[j]==p){
          return p->data;
        }
      }
      head2=head2->next;
    }
    return -1;
}

【问题讨论】:

  • 无需创建数组即可完成任务。此外,使用幻数 200 还不清楚。
  • 是的,我遇到了问题,列表的大小可能比 200 还要大。是的,我知道这不是最好的和最佳的解决方案。
  • 当前代码从节点返回data。返回指向节点的指针(如果没有合并点则返回NULL)不是更有用吗?您可以轻松地从合并的节点指针中获取 data 值,但反之则更难,尤其是在 data 值不唯一的情况下。
  • 没有必要创建一个数组(额外的空间),尽管这是可以使用比简单算法更快的问题之一,但会以使用额外空间为代价。
  • OT: about: a=(SinglyLinkedListNode**)malloc(200*sizeof(SinglyLinkedListNode)); 1) 在 C 中,返回的类型是 void*,可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 2) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,调用perror( "malloc failed" );将你的错误信息和系统认为错误发生的原因输出到stderr

标签: c arrays pointers linked-list


【解决方案1】:
int findMergeNode(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2)
{
    SinglyLinkedListNode *temp = head2;
        while(head1) {
            head2 = temp;
            while(head2) {
                if(head1 == head2) {
                    return head2->data;
                 }
                 head2 = head2->next;
            }
            head1 = head1->next;
        }
        return -1;
    }

【讨论】:

    【解决方案2】:

    在这里仅解决您帖子的一部分:

    声明

    a=(SinglyLinkedListNode**)malloc(200*sizeof(SinglyLinkedListNode));
    

    有几个潜在的问题。
    1) 如果您希望这会为可寻址的数组数组创建内存,那么它并没有按照您期望的那样做。
    2) 在 C 中不需要(或不推荐)强制转换 calloc 的返回值。(在 C++ 中是这样)

    可以通过多种方式创建任意类型变量数组的可寻址数组,以下是一个示例:

    TYPE ** Create2D(ssize_t numArrays, ssize_t maxArrayLen)
    {
        int i;
        TYPE **a = {0};
        a = calloc(numArrays, sizeof(TYPE *));
        for(i=0;i<numArrays; i++)
        {
          a[i] = calloc(maxArrayLen + 1, 1);
        }
        return a;
    }
    

    其中 TYPE 是任何 C 类型,例如 charintfloat,或者在本例中为 SinglyLinkedListNode。只需将 TYPE 替换为任何真实类型,该函数就会创建一个数组数组,例如:

    SinglyLinkedListNode **a;
    a = Create2D(20, 200);//create 20 arrays, each with 200 elements
    

    可通过数组表示法访问的每个元素:a[i][j]

    完成后不要忘记释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2013-12-09
      • 1970-01-01
      • 2016-08-06
      相关资源
      最近更新 更多