从链表反转中得到的启发
下面是链表反转的代码
Node * Reverse_Link(struct Node *&head)
{
struct Node *p,*p1,*p2; //p为当前点,p1为下一个节点,p2暂存p1的下一个节点。
p=head;
p1=head->next;
while(p1)
{
p2 = p1->next; //暂存p1的下一个节点
p1->next = p; //在这一步,p->next将会被替换掉,所以在上一步,先将它缓存起来。
//为下一步交换做准备
p = p1; //将当前节点设置成刚调换的节点。
p1=p2; //将当前节点的下一个节点设置成p1
}
head->next=NULL;
head = p;
return head;
}
交换,交换在很多地方都用到,会不会有很多人都是很本能地先写一个暂存变量,而从不会想为什么。两个容器中的东西要互换,没有第三个容器的帮助是不可能的,首先要做的是将第一个容器1清空,第二个容器2的东西才可能放进来,那第一个容器的东西就要暂存到一个临时的容器3,这就是容器3出现的原因。
//两个同类型的变量可以同样赋值
void Destroy_Link(struct Node *head)
{
struct Node *current,*temp_for_delete;
current = head;
while(current)
{
temp_for_delete=current; //装备炮弹
current = current->next; //发射前准备,删除这个后,要备删除后一个
delete temp_for_delete; //1-3行结合
}
}
在链表删除的时候也用到了临时变量1,临时变量1作为一个删除工厂,和遍历变量2配合一起使用,遍历变量不断地将要删除的变量送到删除工厂中就行删除处理。
保护现场,在这个例子中,每一步要处理的东西变成了两个,那么临时保存的东西就变成了两个,需要的临时变量就变成了两个。同时在while循环的时候,要初始化的变量就变成了两个。
如果遇到了需要循环的时候,应该将循环的东西用循环变量拿到一个临时变量中。