为什么 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);
我正在解决一个链表问题,我必须对第一个和最后一个节点求和,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);