-3

Finding middle element in a linked list

Given a singly linked list of N nodes. The task is to find the middle of the linked list. For example, if the linked list is 1-> 2->3->4->5, then the middle node of the list is 3. If there are two middle nodes(in case, when N is even), print the second middle element. For example, if the linked list given is 1->2->3->4->5->6, then the middle node of the list is 4.

Example 1:

Input: LinkedList: 1->2->3->4->5 Output: 3 Explanation: Middle of linked list is 3. Example 2:

Input: LinkedList: 2->4->6->7->5->1 Output: 7 Explanation: Middle of linked list is 7. Your Task: The task is to complete the function getMiddle() which takes a head reference as the only argument and should return the data at the middle node of the linked list.

Expected Time Complexity: O(N). Expected Auxiliary Space: O(1).

Constraints: 1 <= N <= 5000

class Solution{
    public:
    /* Should return data of middle node. If linked list is empty, then  -1*/
    int getMiddle(Node *head)
    {
        Node* fast = head;
        Node *slow = head;
        
        if (head != NULL){
            while(fast->next != NULL && fast != NULL) //here
            {
                fast = fast->next->next;
                slow = slow->next;
            }
        }
        
        return slow->data;
    }
};

// Runtime Error: Segmentation Fault (SIGSEGV)

class Solution{
    public:
    /* Should return data of middle node. If linked list is empty, then  -1*/
    int getMiddle(Node *head)
    {
        Node* fast = head;
        Node *slow = head;
        
        if (head != NULL){
            while(fast != NULL && fast->next != NULL) //here
            {
                fast = fast->next->next;
                slow = slow->next;
            }
        }
        
        return slow->data;
    }
};

// Problem Solved Successfully
πάντα ῥεῖ
  • 1
  • 13
  • 116
  • 190
Leo Chiu
  • 3
  • 1
  • `&&` is checked left to right. If `fast == NULL`, `fast->next` is illegal and crashes, so it must be checked after making sure `fast` isn't null. – HolyBlackCat Feb 11 '23 at 14:14
  • Please give a [mcve] for both of your examples. As these are now, they can't be compiled for introspection. – πάντα ῥεῖ Feb 11 '23 at 14:14
  • Because that's how `&&` works. Where are you learning C++ from that didn't tell you this? Maybe you should find some better teaching material. – john Feb 11 '23 at 14:18

1 Answers1

0

This while(fast->next != NULL && fast != NULL) makes no sense. If fast does equal NULL then fast->next is undefined. The only way this can be "ok" is when fast is not NULL.

In the second first you first check if fast equals NULL and due to short cuirciting of && only when it is not equal it is dereferenced.

463035818_is_not_an_ai
  • 109,796
  • 11
  • 89
  • 185