在习惯上,我们在实现链表的逆置时都会采用从第一个结点开始遍历并不断将链表的指向逆置的方法,但这样做效率其实不高。假设要逆置的链表为L,更好的方法是先用指针p保存L-〉next,再将链表L的头结点置为Null,亦即L-〉next=Null,而后将p所指向的原存在于L的各个结点插入在已经置空的L中,作为L的第一个元素结点,p则每次下移用于记录剩下结点的位置。具体代码如下:
p=L->next;
L->next=NULL;
while(p&&p->next)//该循环的限制条件意在说明空表和只含一个元素结点的空表不用参加逆置
{
s=p->next;//指针s防止可以结点地址丢失
p->next=L->next;
L->next=p;
p=s;
}
注:我一开始的代码是这样的
firstNode=p=L->next;
L->next=NULL;
while(p&&p->next)//该循环的限制条件意在说明空表和只含一个元素结点的空表不用参加逆置
{if(p!=firstNode){
s=p->next;//指针s防止可以结点地址丢失
p->next=L->next;
L->next=p;
p=s;
}//end if
else{
s=p->next;
p->next=NULL;//其实该式与p->next=L->next;结果是一样的,判断语句完全不必要
L->next=p;
p=s;
}//end else
}
不难发现,进行条件判断其实是多余的,以后更要注意这种情况,以提高代码简洁性