设计算法以判断带头结点的双循环链表 L 是否是对称的,即从前往后和从后往前的 输出序列是相同的。若对称,返回 true,否则返回 false
bool SymmetricalDLList(dnode *L) {
dnode *p, *r;
p = L->next;
r = L->prior;
while (p!=r && p->next != r){
if (p->data == r->data){
p = p->next;
r = r->prior;
}
else
return false;
}
return true;
}
设计算法将带头结点的双循环链表L就地逆置,即利用原表各结点的空间实现逆置
void DLListReverse(node *L) {
node *P, *u; //P 指向当前待逆置的结点,u 指向未逆置的下一个结点
P=L->next; //P 指向原链表的首元素结点,此结点逆置后为尾结点,需要单独处理
if(P!=L) //非空链表,处理第一个结点
{
u=P;
p=p->next; //p 指向链表下一个结点
u->next=L; //建立 next 向循环
L->prior=u; //建立 prior 向循环
} //循环逆置剩余结点
while(P!=L){
u=P;
p=p->next; //p 指未逆置部分下一个结点
u->prior=L; //u 头插成为首元素结点,前向指针指向头结点
u->next=L->next; //u->next 指向已逆置部分原来的首元素结点
L->next->prior=u; //已逆置部分原来首元素结点的 prior 指针指向 u
L->next=u; //L->next 指向 u,u 插入成为首元素结点
}
}