1. C# / Говнокод #16482

    +139

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    Есть односвязный список. Каждый элемент списка содержит указатель на следующий элемент (next). 
    Нам известен указатель на первый элемент списка (root). Необходимо без использования каких-либо 
    дополнительных структур данных и без изменения структуры элементов списка определить зациклен ли данный список.
    
    Ответ
    
    public static boolean isCycleList(Item root){ 
            Item first = root;     
            while(first.getNext() != null){ 
                Item subFirst = root; 
                do { 
                    if (subFirst == first.getNext()) 
                        return true; 
                    subFirst = subFirst.getNext(); 
                } 
                while (subFirst != first.getNext());         
                first = first.getNext(); 
            } 
            return false; 
        }

    Запостил: kegdan, 05 Августа 2014

    Комментарии (21) RSS

    • Из сайтика вопросов собеседования и ответов к ним.
      Ответить
    • > while (subFirst != first.getNext());

      он долбоеб что ли?
      Ответить
      • а, там сверху еще do. подумаешь, гест ошибся. хехе. ладненько.
        Ответить
        • Да, синтаксис сишки — говно, потому что цикл с предусловием и цикл с постусловием сходу не отличишь.
          Ответить
    • static bool isCycled(Item root)
              {
                  Item cur = root;
                  Item prev = null;
                  while (cur != null)
                  {
                      Item seek = root;
                      while (seek != null && seek.next != cur)
                          seek = seek.next;
                      if (seek != prev)
                          return true;
                      prev = cur;
                      cur = cur.next;
                  }
                  return false;
              }
      Ответить
      • private static bool HasCycle(p p)
            {
                p f = p, s = p;
                while ((s = s.Next) != null && (s = s.Next) != null && (f = f.Next) != s) ;
                return s != null;
            }
        Ответить
    • Неужели никто не вспомнит избитое решение это избитой задачи? Про два итератора - быстрый и медленный.

      Про это уже даже книги пишут
      http://www.elementsofprogramming.com/book.html
      Доступная бесплатно глава как раз об этом.
      Ответить
      • А чем мое решение не таково?
        Ответить
        • Да, вроде похоже. Написано только вырвиглазно.
          Ответить
          • Да, надо было класс большой буквой назвать. А так - сишное решение, норм
            Ответить
            • Надо было переменные нормально назвать. fast и slow, например. А у тебя быстрый итератор - s, а медленный - f. Офигенно логично.
              Ответить
            • > сишное решение
              Два изменения одной переменной в одном выражении настораживает сишника и заставляют подсознательно искать УБ.
              Ответить
              • Ушлого Байтоеба?
                Ответить
                • Нет. Два присваивания - как-то медленно. Вот одно присваивание вместо джвух - это да, Ушлый Байтоёб!
                  Ответить
                • Это дрессировщик карманного льва?
                  Ответить
      • Ну как, не вспомнили?
        Ответить

    Добавить комментарий