求解释一个倒叙算法解决思路
求解释一个倒叙算法
Node *Reverse(Node *&head)
{
Node *p1,*p2,*p3;
p1=head;
if (NULL==head||NULL==head->next)
{
return head;
}
p2=p1->next;
while (p2) //看不懂处
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next=NULL;
head=p1;
return head;
}
这个算法在学数据结构时就看不懂,现在依然,求解释
------解决方案--------------------
------解决方案--------------------
p2是遍历整个结点的,可以说p2是第一个结点到最后一个结点的一个遍历,那么p3=p2->next指明了p3就是p2的下一个结点,而且p3有可能是null,p2->next=p1,这里突然出现了p1,我们并不知道p1是什么,所以继续往下看,p1=p2,很明显p1是上一个p2,就是说p1是p2的前驱结点,那么很容易猜到p2->next=p1就是修改此时p2结点的指向,p2=p3就是相当于结点的自增运算啦,其实这个我认为写成for比较好,for语句我一直认为比较好理解while里面要学会判断哪个是自增,哪个是操作
------解决方案--------------------
p2->ntxt = p1,就是把p1这一串放到p2后面。这时,p2临时的是倒序的头。后面还有p1=p2就是把p1又调整回倒序串头。
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
第一句和最后一句,让p2又重新指向下一个结点。
这四个操作是挺漂亮的
------解决方案--------------------
Node *Reverse(Node *&head)
{
Node *p1,*p2,*p3;
p1=head;
if (NULL==head
------解决方案--------------------
NULL==head->next) //如果链表中没有节点或者只有一个节点就返回,就不用转了
{
return head;
}
p2=p1->next; //p2指向p1的下一个节点
while (p2) //只要是p2不是空,就表示没有到达最后一个节点,就循环
{
p3=p2->next; // p3指向p2的下一个节点,主要是用来将p2下一个节点的地址,位置记录下来保存下来
p2->next=p1; // p2的下一个节点指向p1,完成p1和p2逆置
p1=p2; // 这个时候第一个节点和第二节点的逆置完成,将p2作为第一个节点p1
p2=p3; //p3(p2的下一个节点)作为p2,重新进行循环
}
head->next=NULL;
head=p1;
return head;
}
Node *Reverse(Node *&head)
{
Node *p1,*p2,*p3;
p1=head;
if (NULL==head||NULL==head->next)
{
return head;
}
p2=p1->next;
while (p2) //看不懂处
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next=NULL;
head=p1;
return head;
}
这个算法在学数据结构时就看不懂,现在依然,求解释
------解决方案--------------------
------解决方案--------------------
p2是遍历整个结点的,可以说p2是第一个结点到最后一个结点的一个遍历,那么p3=p2->next指明了p3就是p2的下一个结点,而且p3有可能是null,p2->next=p1,这里突然出现了p1,我们并不知道p1是什么,所以继续往下看,p1=p2,很明显p1是上一个p2,就是说p1是p2的前驱结点,那么很容易猜到p2->next=p1就是修改此时p2结点的指向,p2=p3就是相当于结点的自增运算啦,其实这个我认为写成for比较好,for语句我一直认为比较好理解while里面要学会判断哪个是自增,哪个是操作
------解决方案--------------------
p2->ntxt = p1,就是把p1这一串放到p2后面。这时,p2临时的是倒序的头。后面还有p1=p2就是把p1又调整回倒序串头。
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
第一句和最后一句,让p2又重新指向下一个结点。
这四个操作是挺漂亮的
------解决方案--------------------
Node *Reverse(Node *&head)
{
Node *p1,*p2,*p3;
p1=head;
if (NULL==head
------解决方案--------------------
NULL==head->next) //如果链表中没有节点或者只有一个节点就返回,就不用转了
{
return head;
}
p2=p1->next; //p2指向p1的下一个节点
while (p2) //只要是p2不是空,就表示没有到达最后一个节点,就循环
{
p3=p2->next; // p3指向p2的下一个节点,主要是用来将p2下一个节点的地址,位置记录下来保存下来
p2->next=p1; // p2的下一个节点指向p1,完成p1和p2逆置
p1=p2; // 这个时候第一个节点和第二节点的逆置完成,将p2作为第一个节点p1
p2=p3; //p3(p2的下一个节点)作为p2,重新进行循环
}
head->next=NULL;
head=p1;
return head;
}