从链表反转中得到的启发

下面是链表反转的代码

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循环的时候,要初始化的变量就变成了两个。

      如果遇到了需要循环的时候,应该将循环的东西用循环变量拿到一个临时变量中。

 

 

posted @ 2013-05-19 16:46  randroid  阅读(166)  评论(0编辑  收藏  举报