1.两个递增有序链表合并,无重复元素。
void Merge(LinkList &LA, LinkList &LB)
{
p1 = LA->next;
p2 = LB->next;
p3 = LA;
while(p1 && p2)
{
if(p1->data == p2->data)
{
a = p2;
p2 = p2->next;
delete a;
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else if(p1->data < p2->data)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1?p1:p2;
delete LB;
}
2.两个非递减有序链表合并为一个非递增链表。
void Merge(LinkList &A, LinkList &B)
{
p1 = A->next;
p2 = B->next;
A->next = NULL;
p3 = A;
while(p1 || p2)
{
if(!p2)
{
p3->next = p1;
p1 = p1->next;
p3 = p1;
}
else if(!p1)
{
p3->next = p2;
p2 = p2->next;
p3 = p2;
}
if(p1->data >= p2->data)
{
p3->next = p1;
p1 = p1->next;
p3 = p1;
}
else
{
p3->next = p2;
p2 = p2->next;
p3 = p2;
}
}
delete B;
}
3.求AB集合交集放在A链表中。
void Intersection(LinkList &A, LinkList &B)
{
p1 = A->next;
p2 = B->next;
pre = A;
while(p1 && p2)
{
if(p1->data < p2->data)
{
r = p1;
p1 = p1->next;
pre->next = p1;
delete r;
}
else if(p1->data == p2->data)
{
r = p2;
p2 = p2->next;
delete p2;
pre = p1;
p1 = p1->next;
}
else
{
r = p2;
p2 = p2->next;
delete p2;
}
}
p = p1?p1:p2;
while(p)
{
r = p;
p = p->next;
delete r;
}
delete B;
}
4.求AB差集,返回元素个数。
int Dif(LinkList &A, LinkList &B)
{
p1 = A->next;
p2 = B->next;
p3 = A;
num = 0;
while(p1 && p2)
{
if(p1->data>p2->data)
{
p2 = p2->next;
}
else if(p1->data == p2->data)
{
s = p1;
p1 = p1->next;
p3->next = p1;
delete s;
}
else
{
p3 = p1;
p1 = p1->next;
num++;
}
}
return num;
}
5.A分为BC两个链表,A放负数,B放正数。
void Diserve(LinkList &A, LinkList &B, LinkList &C)
{
p = A->next;
p1 = B;
p2 = C;
while(p)
{
if(p->data<0)
{
p1->next = p;
p = p->next;
p1 = p1->next;
}
else
{
p2->next = p;
p = p->next;
p2 = p2->next;
}
}
}
6.遍历一遍求最大结点。
ElemType *FindMax(LinkList &L)
{
p = L->next;
if(!p)
return NULL;
max = p->data;
while(p)
{
if(max > p->data)
max = p;
p = p->next;
}
return max;
}
7.原地逆转链表。
void NZ(LinkList &A)
{
p = A->next->next;
A->next->next = NULL;
while(p)
{
s = p;
p = p->next;
s->next = A->next;
A->next = s;
}
}
8.删除链表中大于mink小于maxk的所有元素。
void DeleteNum(LinkList &A)
{
p = A->next;
pre = A;
while(p)
{
if(p->data < mink || p->data > maxk)
{
s = p;
p = p->next;
pre->next = p;
delete s;
}
else
{
pre = p;
p = p->next;
}
}
}
9.交换双向循环链表p结点指向结点及其前驱结点顺序。
void Change(Node *p)
{
q = p->prior;
q->next = p->next;
p->prior = q->prior;
p->next = q;
q->prior = p;
q->next->prior = q;
p->prior->next = p;
}
10.写一个时间复杂度为O(n)空间复杂度为O(1)的算法,删除长度为n的数组中所有值为item的数据元素。
void DeleteItem(Elem &E, int item)
{
k = 0;
for(i = 0; i < E.Length; i++)
{
if(Elem[i]!=item)
{
Elem[k] = Elem[i];
k++;
}
}
E.length = k;
}