思路:从首元结点依次将所有结点释放掉,头结点后面没有元素后,将头结点的指针域设置为空。
p=L.next,p指向首元结点,但不能直接释放首元节点。要先把下一个结点记录下来
那就用另一个变量q,指向要释放掉结点的下一个结点
q指针变量要存储的是第二个结点的地址,他在第一个结点的next域里存着,只需将第一个结点的Next域赋值给他,就可以指向第二结点了。第一个结点的Next域是指针变量p所指的这一结点的Next域,所以将p的next域赋值给q,就是将下一结点的地址赋值给q,q就指向下一结点了。
那就可以将p删除了
下一个要删q,所以p=q,他们内容一样,然后q在指向下一个
这两句不能交换
p=q;
q=q->next;
不然都指向下一个结点
删到p指针指的结点是空结点结束
反复做则p不为空
最后q=q->next,q指向空,不指向任何结点,再p=q,然后他们都指向空了
我们将头结点的指针域设置为空,就可以结束了
上次是P=L;
要看从哪个开始,如果从头结点开始就,p=L;
如果从首元结点开始,那就p=L->next;
上面是操作单链表最常用的两句.
以下为完整算法
需要两个指针p,q
p存放要删除的结点,q存放p的下一个结点
从第一个存储元素值的结点开始