Свопинг Узлов в единственном связанном списке

Зависит от того, что вы подразумеваете под этим

Один групповой сертификат может использоваться для нескольких хостов с разными записями А.

Например, у вас есть сертификат с подстановочными знаками для домена. *.stackoverflow.com. Вы можете иметь одобренный CA протокол TLS, если на новых серверах, которые вы используете, используется поддомен домена stackoverflow.com

, т.е. mail-server.stackoverflow.com

6
задан Bart 9 March 2013 в 13:24
поделиться

3 ответа

Допустим, у нас есть:

Node1 -> Node2 -> Node3 -> Node4 -> Node5

Чтобы поменять местами два узла, вам нужно поменять местами next значений единиц перед каждым из них, а также next значений узлов, которые вы хотите поменять местами.

Таким образом, чтобы поменять местами, скажем, Node2 и Node3, у вас фактически есть чтобы поменять местами Node1-> next на Node2-> next , а Node2-> next с Node3-> next . Это будет работать, даже если они находятся рядом друг с другом (или даже если это один и тот же узел). Например:

Swap Node1-> next и Node2-> next

Node1->next = Node3
Node2->next = Node2

Поменять местами Node2-> next на Node3-> next

Node2->next = Node4
Node3->next = Node2

Это выглядит так:

Node1 -> Node3 -> Node2 -> Node4 -> Node5

Swapped!

Как показано в разделе комментариев, при замене узла Node1 чем-либо вам придется установить новый заголовок для связанного списка.


В ответ на редактирование вопроса:

Ваш код для обмена почти верно. Однако вам нужно поменять местами firstPrev на secPrev. В моем примере так получилось, что мы дважды меняли местами одно из значений узла next , потому что они были рядом друг с другом. Но логически мы хотим поменять местами следующие из двух предыдущих, а затем поменять местами следующие фактических узлов. Попробуйте следующее:

//swap firstPrev-> next with secPrev->next
tmp = firstPrev->next;
secPrev->next = firstPrev->next;
secPrev->next = tmp;
//swap swap first->next with second->next
tmp = first->next;
second->next = first->next;
second->next = tmp;

Если вы получаете segfault, проверьте переменную tmp - это может быть где-то ошибка выделения или удаления. Откуда у вас segfault?

11
ответ дан 8 December 2019 в 05:56
поделиться

While I am not 100% sure the answer should involve references to node pointer (or pointers to pointers) and this should then handle a case when one of the nodes is the head of list as well.

void swapNodes(node *&first, node *&second)
{
  node *t = second->next;
  second->next = first->next;
  first->next = t;
  t = second;
  second = first;
  first = t;
}

Then you can call it for example:

swapNodes(head, secPrev->next);

or

swapNodes(firstPrev->next, head);

or

swapNodes(firstPrev->next, secPrev->next)

and it should work automagically.

EDIT:

swapNodes could be even more readable:

void swapNodes(node *&first, node *&second)
{
  std::swap(first->next, second->next);
  std::swap(first, second);
}
0
ответ дан 8 December 2019 в 05:56
поделиться

В большинстве реальных сценариев замена значений будет лучшим решением:

void swapNode(call * &head, call * &first, call * &second) {
    // swap values, assuming the payload is an int:
    int tempValue = first->value;
    first->value = second->value;
    second->value = tempValue;
}

Если это не разрешено, то вместо этого вы захотите сделать замену в аналогичном стиле на -> next компонента -> value. Затем выполните еще одну замену компонентов firstPrev-> next и secondPrev-> next. Не упустите особый случай, когда первая или вторая == голова.

7
ответ дан 8 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: