Как использовать узлы списка ссылок для изменения другого связанного списка

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

list<int>list1;
list<int>list2;

list1.push_back( 1 );   // < --- want to modify this list
list1.push_back( 2 );

list2.push_back( 1 );   // with this list

Короче говоря, я хочу использовать list2 как своего рода переменную для изменения list1. Я провел некоторые исследования, похоже, я не могу получить доступ к узлам списка, как массив. Есть ли контейнер, который позволяет мне легко добавлять и удалять узлы, сравнивать и изменять его с другими контейнерами? Я думал, что наборы могут быть альтернативой, но кажется, что я также не могу получить доступ к значениям в наборе. Любая помощь или свидетельство было бы здорово. Заранее спасибо.

РЕДАКТИРОВАТЬ:::

Я ищу, чтобы создать решение судоку. Я поместил все 81 цифру (пустую и указанную) в «связанный список». Я сейчас ищу, чтобы удалить возможных кандидатов из каждого «списка», который представляет 1 ячейку.

Например
listlist1;
listlist2;

list1.push_back( 1 );
list1.push_back( 2 );

list2.push_back( 1 );

Теперь я хочу использовать list2, как это

list1.remove( list2(?) );  // < -- this obviously isn't possible due to how nodes are stored.

Надеюсь, это немного прояснит мой вопрос. Это способ, которым я использую для решения простых судоку, и позже я реализую технику грубой силы.

1

Решение

Вот один из способов, без сомнения, есть и другие. Это зависит от того, каковы ваши обстоятельства. Например, если ваши списки отсортированы, есть лучший способ, чем этот.

list<int> list1 = ...;
list<int> list2 = ...;
for (list<int>::const_iterator i = list2.begin(); i != list2.end(); ++i)
list1.remove(*i);
0

Другие решения

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

list<int> list1;
list<int>& list2 = list1;

list2.push_back(1); //<--- modifies list1

Или используйте указатель:

list<int> list1;
list<int>* list2 = &list1;

list2->push_back(1); //<--- modifies list1

Читайте о указателях Вот

1

Поскольку ваши списки не слишком длинные, я думаю, используя list::remove_if() Ваша лучшая ставка здесь.

Используйте вспомогательную функцию:

bool IsInList2(int el)
{
return std::find(list2.begin(), list2.end(), el) != list2.end();
}

и используйте его в своем коде:

list1.remove_if(&IsInList2);
0
По вопросам рекламы [email protected]