翘二郎腿脚尖勾鞋:高手帮忙看一下这两个语句表达什么意思(c语言)

来源:百度文库 编辑:高考问答 时间:2024/05/01 07:57:30
/* 将head 所指的单链表(带头结点)逆置*/
LinkList ListReverse(LinkList head)
{LNode *p,*q;
if(head->next&&head->next->next) /*当链表不是空表或单结点时*/
{
p=head->next;
q=p->next;
p->next=NULL;
}
while(q)
{p=q;
q=p->next;
p->next=head->next;
head->next=p;
}
return head; /*如是空表或单结点表,直接返回head*/
}
倒数第二句像是插入一个结点,但那个if循环不知表达的是什么意思。
if(head->next&&head->next->next) /*当链表不是空表或单结点时*/
{
p=head->next;
q=p->next;
p->next=NULL;
}
是上面的整个不清楚而不光是if(head->next&&head->next->next) 这一句。

一般的,实现链表时,会将尾结点的next域置为NULL。而在大部分编译环境下,NULL对应0,逻辑假(false)为0,非0值则表示逻辑真(true),所以if(head->next && head->next->next)等价于if(head->next != NULL && head->next->next != NULL),即判断头结点的next域是否不为空,如果不为空,进一步判断第二个结点的next域不为空,如果都成立,则链表至少有2个结点。
而空表和单结点的链表是不需要逆置的。