双链表和循环链表小结
1.双链表
特点:方便查找一个节点的前,后相邻节点
(1)已知某个节点的地址,删除他的时间O(1)
修改p节点前驱节点的next指针和p节点后继节点是prior指针
p->prior->next = p->next;
p->next->prior = p->prior;
(2)在某个节点的前后插入一个节点的时间为O(1)
1.p->prior->next = q;
2.q->prior = q->prior;
3.q->next = p
4.q->prior = q
2.循环链表
1.循环单链表:构成一个环(可以循环查找)
2.循环双链表:构成两个环(可以循环查找,可以通过头节点快速找到尾节点)
删除尾节点,在尾节点前后插入一个节点的时间均为0(1)
3.有序表
题目如下:假设一个有序表的采用顺序表存储,设计一个高效算法删除重复的元素
列如:L=(1,1,1,2,2,2,3,3,3)------>L=(1,2,3)
利用删除所有值为x的元素的算法思路:
void deleupnode1(SQlist *&L)
{
int k = 1;//k记录保留元素的个数
int i;
for(i = 1;i < L->length;i++)
if(L->data[i]!=L->data[i-1])//这里不懂
{
L->data[k] = L->data[i];
k++;//保留的元素增1
}
L->length = k; //顺序表L的长度等于k
}
2.
//两个单链表中求解公共元素
void InterSect(LinkList ha,LinkList hb,LinkList &hc)
{
LinkList pa = ha->next,pb=hb->next,s,r;
hc = (LinkNode)malloc(sizeof(LinkNode));
r = hc;//r指向尾节点
while(pa!=NULL&&pb!=NULL)
{
if(pa->data
pa = pa->next;
if(pa->data>pb->data)
pb = pb->next;
if(pa->data==pb->data)
{
s=(LinkNode*)malloc(sizeof(LinkNode):
s->data=pa->data;
r->next = s;
r = s;
pa = pa->next;
pb = pb->next;
}
}
r->next = NULL;
}