【发布时间】:2009-09-01 19:15:31
【问题描述】:
我有以下代码(对于我的简单测试是正确的)用于没有重复的链表,但我认为它有点难看。
谁能推荐一种更简洁的方法来处理重复代码? 当前有问题的是:
if( (val == cur->val) || (cur->next && (val == cur->next->val)) )
但我认为使用不同的比较运算符可能存在更好的解决方案(我没有看到)。
另外,有人可以给我一个“有用的”断言的建议或在这里。很难判断何时断言,特别是如果你有一个 if 语句为你做这件事。
struct Node
{
Node(int v):val(v),next(NULL){}
int val;
Node * next;
};
void insert(Node ** ppHead, const int val)
{
if(ppHead == NULL)
return;
if(*ppHead == NULL || val < (*ppHead)->val)
{
Node * tmp = new Node(val); // new throws
tmp->next = *ppHead;
*ppHead = tmp;
}
else
{
Node * cur = *ppHead;
while(cur->next && (val > cur->next->val))
cur = cur->next;
if( (val == cur->val) || (cur->next && (val == cur->next->val)) )
return;
Node * tmp = new Node(val); // new throws
tmp->next = cur->next;
cur->next = tmp;
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node * list = NULL;
int x[] = { 5, 4, 6, 7, 1, 8, 1, 8, 7, 2, 3, 0, 1, 0, 4, 9, 9 };
int size = sizeof(x) / sizeof(x[0]);
for(int i = 0; i < size; i++)
insert(&list, x[i]);
Node * cur = list;
while(cur) {
printf (" %d", cur->val);
cur = cur->next;
}
printf("\n");
return 0;
}
【问题讨论】:
-
也许您在作业中使用了错误的数据结构。例如,您是否需要按特定顺序存储节点?如果没有,使用哈希表或平衡二叉树重写代码非常容易。
-
谢谢朱丽叶,但这是一个编码能力问题。 ;-) 不是我遇到的真正问题。
标签: c++ data-structures linked-list