【问题标题】:Why HackerRank always gives Segmentation fault?为什么 HackerRank 总是给出 Segmentation fault?
【发布时间】:2021-11-30 17:39:03
【问题描述】:

我正在解决一个链表问题,我必须对第一个和最后一个节点求和并返回最大和。例如:3-->1-->1-->3。所以程序将添加第 0 个和第 (n-1) 个索引值 (3+3=6),然后添加第 1 个和 (n-2) 个索引值 (1+1 = 2)。由于 6>2,它将返回 6。 它类似于https://www.geeksforgeeks.org/rearrange-linked-list-alternate-first-last-element/

代码

 void reverseList(SinglyLinkedListNode* head)
{
  SinglyLinkedListNode* prev = NULL;
  SinglyLinkedListNode* curr = head;
  SinglyLinkedListNode* next = NULL;

  while(curr)
 {
   next = curr->next;
   curr->next= prev;
   prev = curr;
   curr = next;
 }
  head = prev;

}

int maximumPages(SinglyLinkedListNode* head)  **<---start**
{
 SinglyLinkedListNode* slow = head;
 SinglyLinkedListNode* fast = slow->next;

  //finding middle of linked list
  while(fast && fast->next)
 {
   slow = slow->next;
   fast = fast->next->next;
 }

  //split the list in two
  SinglyLinkedListNode* head1 = head;
  SinglyLinkedListNode* head2 = slow->next;
  slow->next = NULL;

  //reverse the second list
  reverseList(head2);

  //calculate max pages
  int maxi = INT_MIN;
  int sum = 0;

 SinglyLinkedListNode* ptr1 = head1;
 SinglyLinkedListNode* ptr2 = head2;
 while(ptr1 || ptr2)
 {
   sum = ptr1->data + ptr2->data;
   maxi = max(maxi, sum);

   ptr1 = ptr1->next;
   ptr2 = ptr2->next;
 }

   return maxi;     **<---end**
}

我检查了多次,但没有发现代码有任何异常。谁能告诉我分段错误在哪里?

【问题讨论】:

  • 欢迎来到 Stack Overflow。对于您描述的问题,您的代码似乎太复杂了。清单可以有多短?您尝试过哪些测试用例?

标签: linked-list segmentation-fault singly-linked-list


【解决方案1】:

你会在这一行得到异常:

sum = ptr1->data + ptr2->data;

ptr2 可能是NULL,因为左边的列表可能比另一个长。 while 条件不会阻止这种情况的发生。您应该将其更改为更强的条件,使用&amp;&amp; 而不是||

while(ptr1 && ptr2) 

还有另一个问题:反转不会改变主程序的head2 变量的值。该函数仅更改同名的局部变量。您可以通过多种方式解决此问题。一种是让函数返回反转后的新的链表头:

SinglyLinkedListNode * reverseList(SinglyLinkedListNode* head)
{
  // ...all your code ..., and add:
  return head;
}

然后在你的主代码中:

head2 = reverseList(head2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多