今天在写一个链表排序算法时,需要频繁的对链表节点进行位置互换,于是就想找一个操作简单运算效率又高的算法。不知哪根神经不对劲,突然就想试试能不能通过直接互换两个节点的指针,很快写出如下交换函数:
void DoExchange(Node *A, Node *B)
{
Node* temp = A;
A = B;
B = temp;
}
一运行,果然是不行的!接着开始思考为什么这样不行,凭着对指针的直觉,很快想到一个自圆其说的解释,如图:
这里以单链表为例,简化问题。A和B为要互换的两个节点,方框表示节点结构体的存储地址,p和q为指向它们的指针。由于指针互换后,只是改变了p和q指向的地址,而节点间的连接关系并没有改变,这是因为在链表遍历过程中,存储下一个节点地址的指针包含在上一个节点地址中,即存储A地址的指针在地址PreA