p和q是两个指针最初它们都指向head(其实p指向哪里无所谓)代码运行起来之后,每次把p指向一个新的节点(重新分配内存),然后把q的下一项指向p,再把p的下一项指向空此时必须把q重新指向p否则你继续添加下一项的时候,q还指向的是head,并没有变成下一个节点的地址,那么你新节点就不是挂在刚才新增的节点后面,而是依然挂在head后面,把之前的覆盖掉了