Давайте посмотрим на эту часть кода:
while(head && fast->next!=NULL){
fast=fast->next->next;
}
голова никогда не будет нулевой
теперь скажем, что список равен 1 -> 2 -> 3 -> 4-> быстро с нулевой головой после 1-й итерации 1 -> 2 -> 3 -> 4 -> быстро с нулевой головой
теперь смотрите в соответствии с кодом fast-> next не является нулевым, поэтому оно входит в цикл
and sets fast to "fast->next-> next"
which makes
fast = null as
1 -> 2 -> 3 -> 4 -> null
head
fast
Таким образом, когда вы пытаетесь получить доступ к «следующему» из null, вы сталкиваетесь с ошибкой сегментации
Code1 работает из-за условия fast && fast-> next
, так как высначала проверяем существование fast, вы никогда не пытались получить доступ к тому, чего не было.Код вышел из цикла только на fast = null, чего не было в Code2