LinkList reverse_01(LinkList& l)//
{
LinkList k = l;
LinkList pr;//p记录pr的后面节点,pr是首元节点
LinkList p = l->next;//p记录pr的后面节点
LinkList rear = p;//rear记录逆置前第一个数据元素,逆置后变为最后一个
free(k);
pr = NULL;
while (p)// while (p)
{
l->next = pr;//逆置
pr = l; l = p; p = p->next;//所有指针后移一个位置
}
l->next = pr; //p==NULL此时h停留在最后一个节点
LinkList q = new LNode; q->next = l;//解决了头节点的问题
rear->next = NULL;rear记录逆置前第一个数据元素,逆置后变为最后一个,最后指针域赋为空值,表示后面不再有节点
return q;
}
LinkList reverse_02(LinkList& l)
{
LinkList p = l->next;
LinkList pre = NULL;//记录前驱
LinkList s = NULL;//用于记录p
while (p)
{
s = p;
p = p->next;
s->next = pre;
pre = s;
}
l->next = pre;//pre停留在最后一个节点
return l;
}
反思:
(1)一定要画图,进行过程分析
(2)尾指针的用法
(3)前驱指针,记录或跟踪指针,后继指针
(4)工作指针后移,指针后移位置经常用