问题描述
假设循环单链表不空, 且无表头节点无表头指针, 指针P指向链表中某节点。请设计一个算法,将P所指向节点的前驱变为P所指节点的后继节点。
Solution
此问题也可以看作交换p与p的后继节点位置
找到三个指针即可
p
pp:p的前驱
ppp:p的前驱的前驱
void exchangeNode(Node p) {
// 如果只有一个或者两个节点直接退出
if (p->next->next == p) {
return;
}
Node ppp = p, pp = p->next;
// 找到 pp,ppp
while (ppp->next->next != p) {
ppp = ppp->next;
pp = pp->next;
}
// 交换节点
pp->next = p->next;
ppp->next = p;
p->next = pp;
}
节点断开以及连接顺序如下: