如何将双向链表中的节点与其前一个节点交换
How to swap a node in a doubly linked list with its previous one
我有一个项目,我必须做的一件事是将作为参数给定的节点与它之前的方法交换。如果它是第一个,那也没关系,但我和我的室友一整天都在尝试这个。我们尝试制作多个临时节点并弄乱它们,并尝试仅交换节点的元素。很难确切地说出我们做错了什么。我觉得这应该比我们想象的要简单得多,但我们花了很多时间来做这件事。任何建议或帮助将不胜感激。
这听起来像是一个 class 问题。
每个节点都有一个指向前一个节点和一个指向下一个节点的指针,对吧? head 没有 "previous" 指针(例如它为空或有一些特殊值)。
要交换节点,您从:
开始
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;
之前:
pp -> p -> node -> n
之后:
pp -> node -> p -> n
所以你需要更新:
pp.next
node.previous
node.next
p.previous
p.next
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;
}
}
我有一个项目,我必须做的一件事是将作为参数给定的节点与它之前的方法交换。如果它是第一个,那也没关系,但我和我的室友一整天都在尝试这个。我们尝试制作多个临时节点并弄乱它们,并尝试仅交换节点的元素。很难确切地说出我们做错了什么。我觉得这应该比我们想象的要简单得多,但我们花了很多时间来做这件事。任何建议或帮助将不胜感激。
这听起来像是一个 class 问题。
每个节点都有一个指向前一个节点和一个指向下一个节点的指针,对吧? head 没有 "previous" 指针(例如它为空或有一些特殊值)。
要交换节点,您从:
开始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;
之前:
pp -> p -> node -> n
之后:
pp -> node -> p -> n
所以你需要更新:
pp.next
node.previous
node.next
p.previous
p.next
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;
}
}