Приведем фрагменты программ, решающих первую и третью задачи:
{- голову списка обрабатываем отдельно -} while (head<>nil)and(head^.znach =0)do begin p:= head; head:= head^.next; dispose(p); end; {- середина и конец списка обрабатываются вместе -} p:= head; while p^.next <> nil do if p^.next^.znach = 0 then begin q:= p^.next; p^.next:= p^.next^.next; dispose(q); end else p:= p^.next;