读书人

帮忙看看~小弟我是新手

发布时间: 2012-02-11 09:51:35 作者: rapoo

帮忙看看~我是新手
假设以带头结点的单循环链表作非递减有序线性表的存储结构。请设计一个时间复杂度为O(n)的算法,删除表中所有数值相同的多余元素,并释放结点空间。例如:
(7,10,10,21,30,42,42,42,51,70)
经算法操作后变为
(7,10,21,30,42,51,70)



[解决办法]
mark当前值,看其后是否有相同的,有的话删除,没有的话mark下一个。。线性遍历O(n)即可
[解决办法]
恩,你已经排好序了,所以只要比较相邻两个链表项的值,相同就删除好了
把要删除的项拿出来释放掉,next指针往下一个指向就可以了
[解决办法]
都排序好了,就是比较删除的问题了,这个应该比较轻松撒,比你排序轻松得多嘛
[解决办法]
每个都要检查 貌似至少也要O(n)了
[解决办法]
删除完相同节点,剩下的东西显示后,再倒置显示哈、

希望对你有帮助、

#include <stdio.h>


void InsertList();
void InitList();
void TravList();
void reverse();
void delesame();

typedef struct node
{
int info;
struct node *link;
}Node,*List;

void main()
{
List Ha,Hb,Hc;
int a[]={3,3,3,3,10,25,25,25,36};
int b[]={5,25,30,136,140};
int i=0,n=9,m=5;
InitList(&Ha);
InitList(&Hb);
InitList(&Hc);
for(i=0;i<n;i++)
InsertList(Ha,i+1,a[i]);
for(i=0;i<m;i++)
InsertList(Hb,i+1,b[i]);
TravList(Ha);
delesame(Ha);
TravList(Ha);
reverse(Ha);
TravList(Ha);
getch();
return ;
}

void InitList(List *H)
{
List q;
q =(List)malloc( sizeof( Node ) );
q->link=NULL;
*H = q;
}

void InsertList(List H,int i,int x)
{
int j=1;
List p,q;
p = H;
while(p->link!=NULL && j<i)
{
p = p->link;
j++;
}
q =(List)malloc(sizeof(Node));
q->info=x;
q->link=p->link;
p->link=q;
return;
}

void TravList(List H)
{
int i,j;
List p,q;
p=H;
for(i=0;p->link!=NULL;i++)
{
p=p->link;
printf("%d ",p->info);
}
printf("\n");
}

void reverse(List H)
{
List p,q;
if(H->link==NULL || H->link->link==NULL) return ;
p = H->link->link;
H->link->link=NULL;
while(p!=NULL)
{
q = p->link;
p->link = H->link;
H->link = p;
p = q;
}
return;
}

void delesame(List H)
{
List pro=H->link;
List cur=pro->link;
List temp=pro;
while(pro)
{
while(cur)
{
if(cur->info==pro->info)
{
temp->link=cur->link;
cur=cur->link;
}
else
{
temp=temp->link;
cur=cur->link;
}
}
pro=pro->link;
temp=pro;
if(pro)
cur=pro->link;
}

}
[解决办法]

探讨

恩,你已经排好序了,所以只要比较相邻两个链表项的值,相同就删除好了
把要删除的项拿出来释放掉,next指针往下一个指向就可以了

[解决办法]
探讨
引用:

恩,你已经排好序了,所以只要比较相邻两个链表项的值,相同就删除好了
把要删除的项拿出来释放掉,next指针往下一个指向就可以了

同意

读书人网 >软件架构设计

热点推荐