求解释一个倒叙算法解决思路

求解释一个倒叙算法
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->next=p1; 是什么意思哪第一次循环时p1指向第一个结点,p2指向第二个结点,p3指向第三个节点,经过p2->next=p1后p2是经过那个结点了啊?


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;