2015-10-13 1 views
-2

Я знаю, как удалить узел из переднего списка одного связанного списка, но я понятия не имею, как удалить его из любого произвольного местоположения.удаление узла в любом месте связанного списка

В моей конкретной проблеме я продолжаю передавать целочисленное значение x в каждый узел связанного списка. Я могу добавить и удалить, но есть функция, которую мне нужно написать где, если бы я идентифицировал два x, которые являются одинаковыми, я удаляю другой экземпляр.

Я могу привести примеры своего кода, если кому-то нужны примеры того, что я сделал до сих пор. Спасибо за любые ответы

Кроме того, я работаю с единственным списком.

ответ

1

Это недостаток, который имеет связанный список. Он требует, чтобы итерация выполняла удаление, так как вы не можете найти предыдущий элемент произвольного элемента. То, что вы можете найти, это его следующий элемент. Вам нужно выполнить итерацию с заголовка списков, чтобы найти его предыдущий элемент.

Надеюсь, это поможет.

1

Что я делал, когда я искал списки, а что нет: при повторении по списку я сохранил указатель на предыдущий элемент в отдельной переменной, и если бы я решил, что мне нужно удалить текущий элемент , У меня уже был указатель на предыдущий элемент.

Таким образом, псевдо-код мудрый (чтобы лучше проиллюстрировать его), это было бы что-то вроде этого:

prevValue = NULL 
for curValue = root; curValue != NULL; curValue = curValue->Next 
LOOP 
IF *need to delete curValue* 
THEN 
    IF prevValue == NULL 
    THEN 
     root = curValue->Next 
     delete curValue 
     curValue = root 
    ELSE 
     prevValue->Next = curValue->Next 
     delete curValue 
     curValue = prevValue 
    END IF 
END IF 
prevValue = curValue 
END LOOP 
+0

Я попробовал то, что вы сказали, используя время цикла , Проблема в том, что я не знаю, что делать, удаляя мой узел. – gonavy96

+0

Узел * removeAge = head; \t \t в то время как (removeAge! = NULL) \t \t { \t \t \t если (test_age_contained_in_singly_linked_list (х)) \t \t \t { \t \t \t \t // Все идеи здесь? \t \t \t} \t \t \t removeAge = removeAge-> следующая; \t \t} – gonavy96

+0

Благодарю вас, кстати, вы и все здесь четко дали понять, что делать! Как я могу удалить узел внутри оператора if? – gonavy96

1

Поскольку каждый узел имеет только ссылку на последующий узел, вам придется перебирать над весь список, чтобы получить предыдущий элемент, а затем связать предыдущее со следующим узлом. (Рядом, как в одном, после этого вы хотите удалить)

0

узел удалить (узел головки, внутр d) {

if(head==NULL) 
    cout<<"empty linked list\n"; 
else { 
    node*curr=head,*pre=NULL; 
    while (curr!=NULL && curr->data !=d) 
    { 
     pre=curr; 
     curr=curr->next; 
    } 
    if(curr==NULL) 
     cout<<"Mahloch this number not found\n"; 
    else { 
     if(pre==NULL) 
      head=curr->next; 
     else 
      pre->next=curr->next; 
     curr->next=NULL; 
     delete(curr); } 

}return head; 

}

+0

Предоставьте описание с вашими ответами, это поможет другим понять ваш метод. – cosmoonot