对于没有重复项的链表,我有以下代码(对于我的简单测试是正确的),但我认为它有点难看。
有人可以推荐一种更简洁的方法来处理重复的代码吗? 目前的问题是:
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;
}
答案 0 :(得分:4)
我会写得更像:
void insert(Node ** ppHead, const int val)
{
if (ppHead == NULL)
return;
while (*ppHead && (*ppHead)->val < val)
ppHead = &(*ppHead)->next;
if (*ppHead && (*ppHead)->val == val)
return;
Node * tmp = new Node(val); // new throws
tmp->next = *ppHead;
*ppHead = tmp;
}
答案 1 :(得分:2)
这会有用吗?
// Note the change from > to >=
while(cur->next && (val >= cur->next->val))
{ cur = cur->next;
}
if (val == cur->val)
{ return;
}
答案 2 :(得分:1)
嗯,首先,如果你将它用于生产代码,那么你应该使用std::
,如果这是一个选项。
我对你的代码的思考越多,我就越认为你应该保留两个指针。基本上是当前Node
和前一Node
之一。如果cur == NULL
,请在prev
之后插入。如果cur->value == val
,请返回。然后,您可以检查是否cur->value < val
,如果是,则推进两个节点。
您目前有特殊代码来处理*ppHead == NULL
。但是,如果您将prev
改为Node** curPtr
,则无需执行此操作。首先是curPtr=ppHead
和cur=*curPtr
。那么上面的算法应该适用于整个事情。
或者作为刚刚为您编码的人,您可以使用ppHead作为curPtr变量本身和(* ppHead)作为cur。不确定哪个更具可读性。
答案 3 :(得分:-1)
我会向Node添加一个方法来执行查找操作(*未经测试的代码):
Node* Find(int value)
{
if( this.val == value ) return this;
if( this.next == null ) return null;
return next.Find(value);
}
然后在插入之前,您要检查是否存在:
if( null == _head || null == _head.Find(value) )
... add value ...