循环链表(判断双循环链表是否为对称,将两个单循环链表合并成一个循环链表)
一、判断带头节点的双循环链表是否为对称链表
思想:设置两个指针,一个从头开始,一个从后开始遍历,两个指针相等,或者其中一个指针的下一个节点为另外一个节点时结束遍历。如果数据相同,则往后遍历。否则不是对称链表。
代码:
bool symmetry(LinkList L){
DNode *p=L->next,*q=p->prior;//两个移动指针
while(p!=q&&p->next!=q){//终止条件
if(p->data==q->data){//相等,则继续往后遍历
p=p->next;
q=q->next;
}else{//不是对称链表
return false;
}
} //是对称链表
return true;
}
时间复杂度O(n);空间复杂度O(1)
二、两个循环单链表,链表头指针分别指向h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后的链表任保持循环链表形式。
思想:找到两个链表的尾指针,将第一个链表的尾指针与第二个链表的头指针链接起来,使其成为循环。
代码:
LinkList merge(LinkList &h1,LinkList h2){
LNode *p,*q;
p=h1;
while(p->next!=h1){//找h1表尾
p=p->next;
}
q=h2;
while(q->next!=h2){//找h2表尾
q=q->next;
}
p->next=h2;//将h2链接到h1之后
q->next=h1;//h2的尾节点指向h1
retuen h1;
}
时间复杂度O(n);空间复杂度O(1)