2016-12-11 2 views
0

Я только что получил этот вопрос из учебника, но я просто не могу понять, что это такое. Вопрос спрашивает: «Объясните в одном предложении, что делает функция, и что« плохо »в этой функции?» (Это не связано с стилем программирования).Рекурсивный Связанный Список Разница

И, между прочим, какая разница между «return f (x, p-> next)» и «p-> next = f (x, p-> next)»? Я просто не могу понять разницу между этими двумя.

struct Node { 
    int data; 
    Node* next; 
}; 

Node* f(int x, Node* p) { 
    if (p == nullptr) { 
     return nullptr; 
    } 
    else if (p->data == x) { 
     return f(x, p->next); 
    } 
    else { 
     p->next = f(x, p->next); 
     return p; 
    } 
} 
+2

Подумайте, что произойдет для очень длинного связанного списка. Что произойдет в этом случае? (Подсказка: как называется этот сайт?) – MrEricSir

+0

stackoverflow. Потому что он не может содержать больше пространства памяти? –

+0

Стек ограничена. Обычно несколько МБ. – drescherjm

ответ

2

Что f делает пройти через связанный список, удаление любых элементов, которые удерживают значение x.

else if (p->data == x) { // if the next element has our target value 
    return f(x, p->next); // make that element's next element, become our own next element 
} 

Что плохого о нем, что std::vector существует, и в то время как

vec.erase(std::remove(vec.begin(), vec.end(), x), vec.end()); 

не самая изящная строка кода, это чертовски много более осмысленное и узнаваемой, чем рекурсивные функции указателей.

Также f утечки памяти. Удаленный элемент не удаляется; f просто перезаписывает указатель, который знает, где он находится.