题目
题目:假设有一个双向链表,链表中每个节点定义如下:
public class Node {
public Node Before;
public Node After;
public int Content;
}
请写出一段逻辑,将已知的两个节点(A节点、B节点)在链表中的位置互换下
转换前:
转换后:
代码
// 交换节点位置(注意:我们不知道a节点和b节点的位置以及先后顺序)
void changeNode(Node a, Node b) {
Node aBefore = a.Before; // a节点的上一个节点
Node aAfter = a.After; // a节点的下一个节点
Node bBefore = b.Before; // b节点的上一个节点
Node bAfter = b.After; // b节点的下一个节点
// 通过判断a节点来决定b节点应该怎么做,用来搞定b节点
if (aBefore == null) {
// a节点是头结点
b.Before = null;
b.After = aAfter;
aAfter.Before = b;
} else if (aAfter == null) {
// a节点是尾节点
b.Before = aBefore;
b.After = null;
aBefore.After = b;
} else {
// a节点是中间节点
b.Before = aBefore;
b.After = aAfter;
aBefore.After = b;
aAfter.Before = b;
}
// 通过判断b节点来决定a节点应该怎么做,用来搞定a节点
if (bBefore == null) {
// b节点是头结点
a.Before = null;
a.After = bAfter;
bAfter.Before = a;
} else if (bAfter == null) {
// b节点是尾结点
a.Before = bBefore;
a.After = null;
bBefore.After = a;
} else {
// b节点是中间节点
a.Before = bBefore;
a.After = bAfter;
bBefore.After = a;
bAfter.Before = a;
}
}