swap method

void swap(
  1. N node1,
  2. N node2
)

交换两个节点的位置

Implementation

void swap(N node1, N node2) {
  assert(
    node1.mounted && node2.mounted,
    'ElLinkedList Error: swap 交换的两个节点必须都处于挂载状态!\n'
    '$node1\n'
    '$node2',
  );

  assert(
    node1.list == this && node2.list == this,
    'ElLinkedList Error: swap 交换的两个节点必须指向同一个链表对象!\n'
    '$node1\n'
    '$node2',
  );

  assert(node1 != node2, 'ElLinkedList Error: swap 交换的两个节点不能相同!');

  if (node1.next == node2) {
    assert(node2.prev == node1);
    node1._next = node2.next;
    node2._prev = node1.prev;
    node1._prev = node2;
    node2._next = node1;
  } else if (node1.prev == node2) {
    assert(node2.next == node1);
    node1._prev = node2.prev;
    node2._next = node1.next;
    node1._next = node2;
    node2._prev = node1;
  } else {
    final prev1 = node1.prev;
    final next1 = node1.next;
    final prev2 = node2.prev;
    final next2 = node2.next;

    node1._prev = prev2;
    node1._next = next2;
    node2._prev = prev1;
    node2._next = next1;
  }

  if (node1.prev == null) {
    _first = node1;
  } else {
    node1.prev!._next = node1;
  }

  if (node2.prev == null) {
    _first = node2;
  } else {
    node2.prev!._next = node2;
  }

  if (node1.next == null) {
    _last = node1;
  } else {
    node1.next!._prev = node1;
  }

  if (node2.next == null) {
    _last = node2;
  } else {
    node2.next!._prev = node2;
  }
}