如何将双链接列表中的节点与其前一个节点交换



我有一个项目,我必须做的一件事是将作为参数提供给方法的节点与之前的节点交换。如果是第一个,那就没问题,但我和室友一整天都在尝试。我们尝试制作多个临时节点并对其进行破坏,并尝试仅交换节点的元素。很难说我们到底做错了什么。我觉得这应该比我们想象的简单得多,但我们已经花了很多时间。如有任何建议或帮助,我们将不胜感激。

之前:

pp -> p -> node -> n

之后:

pp -> node -> p -> n

因此您需要更新:

  1. pp.next
  2. node.previous
  3. node.next
  4. p.previous
  5. p.next
  6. n.previous

因此:

private void swapWithPrevious(Node node) {
   if(n.previous == null) { // first node
       return;
   }
   Node p = node.previous;
   Node pp = p.previous;
   Node n = node.next;
   if(pp != null) {
       pp.next = node;
   }
   node.previous = pp;
   node.next = p;
   p.previous = node;
   p.next = n;
   if(n != null) {
       n.previous = p;
   }
}

这听起来像是一个类问题。

每个节点都有一个指向上一个节点的指针和一个指向下一个节点,对吧?头没有"上一个"指针(例如,它为null或具有一些特殊值)。

要交换节点,请从以下内容开始:

Node node = the node passed in
Node previousNode = node.previous

除了previousNode为空的特殊情况:

previousNode.next = node.next;         // this used to point to node
previousNode.previous.next = node;     // this used to point to previousNode
node.previous = previousNode.previous; // this used to point to previousNode
node.next.previous = previousNode;     // this used to point to node
node.next = previousNode;
previousNode.previous = node;

最新更新