已知L 是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点
1.删除P结点的直接后继结点
思路:先用工作结点保存P结点的直接后继,然后将P结点的指针域指向P结点的直接后继节点的直接后继节点,然后再删除该工作结点。
Q = P->next;
P->next = P->next->next;
free(Q);
2.删除P节点的直接前驱结点(有毛病)
思路:用工作结点保存P结点,然后将表头结点赋给P结点,进行遍历,找到初始时P结点的直接前驱结点的直接前驱结点,即为此时的P结点,再将该P结点的指针域指向其直接后继结点的直接后继结点,即指向初始时的P结点
Q = P;
P = L;
while (P->next->next != Q) {
P = P->next;
}
P->next = P->next->next;
free(Q);
3.删除P结点(有毛病)
Q = P;
P = L;
while (P->next != Q) {
P = P->next;
}
P->next = P->next->next;
free(Q);
4.删除首元结点
P = L;
Q = P->next;
P->next = P->next->next;
free(Q);
5.删除尾元结点
while(P->next->next != NULL) {//找到尾元结点的直接前驱结点
P = P->next;
}
//P结点即为尾元结点的直接前驱,Q结点即为尾元结点
Q = P->next;
P->next = P->next->next;//尾元结点的指针域实际是指向空
free(Q);