已知L是无表头结点的单链表,且P既不是首元结点,也不是尾元结点:
1.在P结点后插入S结点
思路:在P结点之后插入结点S,只需要更改P和S结点的指针即可,即原先的P结点的直接后继作为S结点的直接后继,然后S结点变为P结点的直接后继,这两步操作的顺序不可改变
[1]:S->next = P->next;
[2]:P->next = S;
2.在P结点前插入S结点
思路是:先保存P结点,然后将单链表的第一个结点表示为P结点,然后从第一个结点开始遍历找到初始时的P结点的直接前驱,然后再在P结点的直接前驱后面插入S结点
Q = P; //将P结点赋给工作结点Q
P = L;//由于L是无表头的单链表,将L赋给P,也即是将P结点作为第一个结点
while (P->next != Q) { //此时的P结点为第一个结点,依次遍历,直到Q结点的前一个结点,此时的Q结点即为初始时的P结点
P = P->next;
}
//此时的P结点即为初始时的P结点的直接前驱,以下的操作即为在P结点之后插入S结点
S->next = P->next;
P->next = S;
3.在表首插入S结点
S->next = L;
L = S;
4.在表尾插入S结点
思路:先找到最后一个结点,然后再最后一个结点的后面插入S结点,然后将S结点的指针域置空。
while (P->next != NULL) { //找到最后一个结点
P = P->next;
}
//在最后一个结点之后插入S结点
P->next = S;
//因为S结点是最后一个结点,所以其指针域为空
S->next = NULL;