Как насчет:
testList.AddAfter(node1, node2.Value)
testList.AddAfter(node2, node1.Value)
testList.Remove(node1)
testList.Remove(node2)
Это четыре операции O (1), которые будут работать независимо от того, находятся ли узлы в начале или в конце списка. Единственная проблема состоит в том, что если node1 == node2, он добавит два новых узла, удалит существующий и затем выдаст исключение, когда попытается удалить его снова. Очевидно, это не проблема, если ваш алгоритм проверяет, отличаются ли они от начала ...
РЕДАКТИРОВАТЬ: Doh. Документы MSDN ввели меня в заблуждение, что Value
только для чтения. (В нем говорится: «Получает значение, содержащееся в узле», а не «Получает или задает [...].» На самом деле это доступно для записи, поэтому вы могли бы сделать:
Label tmp = node1.Value
node1.Value = node2.Value
node2.Value = tmp
С другой стороны, все, что уже имеет ссылку на узлы, увидит изменение, которое может быть не тем, что вы хотите. Конечно, все, что уже имеет ссылку на узлы, в конечном итоге увидит узлы, которые больше не являются частью списка, используя мой первый подход ...