2013-11-25 3 views
0
public bool add(int e) 
    { 
     if(head == null) 
     { 
      Node n = new Node 
      { 
       element = e 
      }; 
      head = n; 
      return true; 
     } 
     Node t = head; 
     if(t.next == null) 
     { 
      if(t.element == e) 
      { return false; } 
      Node n = new Node 
      { 
       element = e 
      }; 
      t.next = n; 
      return true; 
     } 
     t = t.next; 
     this.add(e); 

     return true; 
    } 

Это код для добавления нового узла в набор. Не допускается дублирование значений. Существует Основной класс, называемый Sets, и один внутренний класс, называемый Nodes. Я знаю Узел t = голова; создает проблему, так или иначе, чтобы сделать эту рекурсивную? Даже прохождение дополнительных необязательных параметров не помогает.Рекурсивная реализация «append if not present» для связанного списка

+0

Я изменил название, чтобы соответствовать вашему образцу кода - выглядит как то, что вы называете «набор «на самом деле является единственным связанным списком - не стесняйтесь возвращаться/меняться. Стандартная рекурсивная реализация для него - «вставка после первого ИЛИ рекурсивно вызывает список, начинающийся со второго элемента». –

+0

Это связанный список, но я использую его для реализации набора. Но я считаю, что связанный список является более общим и будет легко искать в поиске. – Shah

ответ

2

Если я правильно понял ваш вопрос, чтобы сделать его рекурсивным, вам нужно разбить его на две функции, общедоступную для обработки футляра head == null и личную для обработки n.next == null и является рекурсивной.

public bool add(int e) 
{ 
    if (head == null) 
    { 
     head = new Node { element = e }; 
     return true; 
    } 

    return add(head, e); 
} 

private bool add(Node n, int e) { 
    if (n.element == e) 
     return false; 

    if (n.next == null) { 
     n.next = new Node { element = e }; 
     return true; 
    } 

    return add(n.next, e); 
} 

Однако, я хотел бы предложить вместо делать что-то похожее на следующее, который делает все, что в одной функции:

public bool add(int e) 
{ 
    if (head == null) 
    { 
     head = new Node { element = e }; 
     return true; 
    } 

    if (head.element == e) 
     return false; 

    Node n = head; 
    while (n.next != null) { 
     if (n.element == e) 
      return false; 
     n = n.next; 
    } 

    n.next = new Node { element = e }; 
    return true; 
} 
+0

+1 это похоже на то, что хочет OP (довольно стандартный «рекурсивно вставлять элемент в список») - вы можете добавить поддержку предиката, который проверяет, существует ли элемент в списке. –

+0

Спасибо, но я уже пробовал этот, и он работает. – Shah

+0

@AlexeiLevenkov Я добавил предикат, чтобы проверить, существует ли элемент уже. – Pandacoder

Смежные вопросы