Обмен двух узлов в LinkedList - PullRequest
       21

Обмен двух узлов в LinkedList

0 голосов
/ 04 декабря 2009

Я столкнулся с простой «проблемой»: обмен двух узлов в LinkedList ( .NET 2 ). Как мне сделать это «оптимальным» способом. Спасибо!

Dim label1 As New Label()
Dim label2 As New Label()
'... some code
Dim testList As New LinkedList(Of Label)
'... some code
Dim node1 As LinkedListNode(Of Label) = testList.Find(label1)
Dim node2 As LinkedListNode(Of Label) = testList.Find(label2)


If ??? Then
  ' exchange two nodes
End If

это

node1.Value = label2
node2.Value = label1

достаточно?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2009

Я не знаю реализацию, но если ваши узлы имеют просто одно значение (в дополнение к следующей и предыдущей ссылкам), вы можете просто поменять местами значения.

2 голосов
/ 04 декабря 2009

Как насчет:

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

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

...