为什么 HackerRank 总是给出 Segmentation 错误?

Why HackerRank always gives Segmentation fault?

我正在解决一个链表问题,我必须对第一个和最后一个节点求和,return 求最大和。例如:3-->1-->1-->3。因此程序将添加第 0 个和第 (n-1) 个索引值 (3+3=6),然后添加第 1 个和第 (n-2) 个索引值 (1+1 = 2)。由于 6>2,它将 return 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**
}

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

您将在这一行得到异常:

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

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

while(ptr1 && ptr2) 

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

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

然后在你的主代码中:

head2 = reverseList(head2);