王道综合题17.设计一个算法用于判断带头结点的循环双链表是否对称及其注意思考:while循环第二个判断条件易误写成p->next!=q,分析这样会产生什么问题。

Posted weixin_43739821

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道综合题17.设计一个算法用于判断带头结点的循环双链表是否对称及其注意思考:while循环第二个判断条件易误写成p->next!=q,分析这样会产生什么问题。相关的知识,希望对你有一定的参考价值。

算法思想:
让p从左向右扫描,q从右向左扫描,直到它们指向同一结点(p==q,当循环双链表中结点个数为奇数时)或相邻(p->next=q或q->prior=p,当循环双链表中结点个数为偶数时)为止,若它们所指结点值相同,则继续进行下去,否则返回0。若比较全部相等,则返回1。

int Symmetry(DLinkList L){
    //本算法从两头扫描循环双链表,以判断链表是否对称
    DNode *p=L->next, *q=L->prior;    //两头工作指针
    while (p! =q&&q->next! =p)    //循环跳出条件
        if (p->data==q->data) {    //所指结点值相同则继续比较
            p=p->next; q=q->prior;
        }
        else  //否则,返回0
            return 0;
    return 1;  //比较结束后返回1
}

探讨问题:
while循环第二个判断条件易误写成p->next!=q,分析这样会产生什么问题.

答:如果写成p->next!=q,那么假如在要判断的链表长度为偶数个时,当p和q分别指向最中间俩个结点,此时根据p->next!=q条件,跳出了循环返回1,若这俩个结点的值是不同的,那么就会产生错误的判断,所以应该先判断这俩个结点的值是否相同,再根据条件q->next!=p跳出循环。

图解:

以上是关于王道综合题17.设计一个算法用于判断带头结点的循环双链表是否对称及其注意思考:while循环第二个判断条件易误写成p->next!=q,分析这样会产生什么问题。的主要内容,如果未能解决你的问题,请参考以下文章

不带头结点的单链表L,设计一个递归算法逆序输出所有结点值

链表 | 递归删除不带头结点链表所有x元素

经典算法学习——非循环双向链表实现冒泡排序(不带头结点)

线性表练习之Example037-判断带头节点的循环双链表是否对称

栈练习之Example003-用不带头结点的单链表存储链栈并实现栈相关算法

线性表练习之Example042-设计一个递归算法,删除不带头结点的单链表 L 中所有值为 x 的结点