算法思想:
双指针从头尾相向遍历,指向元素相同继续遍历,不同返回false,直到遍历到中点,链表长度有奇偶,所以跳出循环条件不同。如果链表长度为奇数的话,跳出条件很好想就是p!=q,如果是偶数的话,其实也不难理解。如果写成p-next!=q 的话,此时跳出循环,p和q所指元素就无法比较。正确的条件是q->next!=p,即p q第一次背靠背。图解如下:
代码如下:
bool Symmetry(DLinkList L) {//判断带头结点双链表是否对称
DNode *p=L->next, *q=L->prior;
while (p!=q&&q->next!=p){
if(p->data!=q->data)
return false;
p=p->next;
q=q->prior;
}
return true;
}
那其实我们还可以再发散一下思维,我们知道头节点(说明可见这篇博客)是我们人为创造的结点,只不过数据域没有手动赋值,但会有一个对应数据类型的默认值。循环双链表撑开可以看成一个圆,一般来说双链表对称是以头节点出发进行比较,假设我们把头节点看成一个正常的点,即它的数据域为0,那可以思考一下,此时会有几个对称点呢?由上述函数知,形参是一个头指针,那么可以类比,如果判断一个点是不是对称点,只需传入指向该点的指针即可。若要寻找有几个对称结点,将一半的结点遍历一次即可。