有段程序请帮我理解一下 ,最好是 每句都注释,我初学数据结构 很多不懂 谢谢。

LinkListDemo(LinkListL){ListNode*Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while(P->next)... LinkList Demo(LinkList L){
ListNode *Q,*P;
if(L&&L->next){
Q=L;L=L->next;P=L;
while (P->next) P=P->next;
P->next=Q; Q->next=NULL;
}
return L;
}

谢谢。
展开
 我来答
易见万眼享1j
2011-08-19 · TA获得超过236个赞
知道答主
回答量:261
采纳率:0%
帮助的人:215万
展开全部
LinkList Demo(LinkList L){ //函数:带入的参数时一个链表
ListNode *Q,*P; //定义两个指针Q,P 指向两个链表节点
if(L&&L->next){ //如果L不指向一个空节点,而且L的下一个节点也不为空(就是说L至少指向一个拥有2个或2个以上节点的链表)
Q=L;L=L->next;P=L; //赋值语句,Q保存指向头节点(第一个节点)的指针,P指向链表的下一个节点
while (P->next) P=P->next; //当P的下一个节点不为空时,P指向下一个节点,一直找到最后一个节点
P->next=Q; Q->next=NULL; //让找到的这个节点P->next指向头结点Q
}
return L; //返回链表指针L
} //该函数功能就是让链表头尾相接,形成一个环,也就是循环链表
追问
你好,感谢你的回复。
我的理解是
ListNode *Q,*P; 是创建L链表的两个指针 Q 和 P 对吗?

还有,这是个课后题,我看了下答案 是说 将开始结点摘下链接到终端结点之后成为新的终端结点,而原来的第二个结点成为新的开始结点,返回新链表的头指针。

感觉我还是不理解 Q=L;L=L->next;P=L; 这句话的含义。
追答
P->next=Q; Q->next=NULL;这行我少看了半句 不好意思。确实是答案所说的功能。
P和Q是2个临时节点而已,只是为了辅助操作而存在的,他们只在函数中有用,用完就废了。并不是L中的具体节点。
首先L是指向链表头结点的指针,这个你明白吧?
Q=L; 表示Q指向了头结点,相当于Q把头结点保存了。
L=L->next;这句表示把L赋值为L的下一个节点的指针,也就是说L指向了下一个节点。
P=L;这句表示P存下了当前L指向的节点。
这三句走完后,Q指向头结点,L指向第二个节点,P指向第二个节点。
while (P->next) P=P->next;走完后,P->next指向是最后一个节点,P指向倒数第二个节点
P->next=Q; 这句话表示:由于P->next指向最后一个节点,而Q是头结点,所以原来的最后一个节点指向了原来的头结点
Q->next=NULL;这句话表示:头节点指向一个空节点,之前Q是头结点的时候,他后面是有其他节点的,这句话运行完之后,Q就指向了NULL,现在Q就是最后一个节点了。原来的第二个节点成了现在的头结点
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式