2014-03-04 36 views
0

我搜索了以前提出的问题,但找不到我正在寻找的内容。我很好奇,如果任何人有任何想法如何删除链接列表的每个其他节点。我有一个叫做duplicate的函数,它取1 2 3并将它变成1 1 2 2 3 3。删除其他每个节点都可以正常工作,无需比较它们或任何其他节点。如果任何人有任何见解。请不要只发布源代码。删除链接列表的每个其他节点

继承人我试图做但没有工作。

Node *current; 
Node *undo; 
for (current = front, undo = current->next->next; 
undo != NULL; current = current->next, undo = current->next->next){ 
    current->next = undo; 
} 

这将输出1 1 2 2 3 3 3

感谢您的任何帮助。稍后我可以发表评论以澄清任何误解。

+1

你的问题有点不清楚。如果你想复制元素,那你为什么说你在'删除'节点? –

+0

对不起,我的意思是,删除其他节点。 – WombatCombat

+0

你不是删除节点,而是你只是改变链接...如果你想我可以添加代码... – HadeS

回答

1

原始代码:

for (current = front, undo = current->next->next; 
    undo != NULL; 
    current = current->next, // this moves current on before you use it's next pointer 
    undo = current->next->next){ 
    current->next = undo; 
} 

要修复,而无需重新分配不需要的节点(假定有一个偶数的节点):

for (current = front; current != NULL; current = current->next){ 
     current->next = current->next->next 
} 

为了处理奇数长度列表,并删除移除的节点的存储器:

for (current = front; current && current->next ; current = current->next){ 
     undo = current->next; 
     current->next = current->next->next 
     delete undo; 
} 
+0

你会推荐什么解决这个问题? – WombatCombat

+0

_undo = current-> next-> next_如果current-> next是null,它不会创建seg故障吗? –

+0

谢谢你,真是太完美了。你提到了释放释放,那么我将如何释放节点? – WombatCombat

0

我会在C++ 11中使用std::list(或者如果需要,也许是std::forward_list)和std::copy_ifstd::remove_if

否则,记住指针的地址进行修改,是这样的:

Node**undoad = &front; 
int cnt=0; 
for (current=front; current != NULL; current=current->next) { 
    if (cnt%2 == 1) { 
    Node*undo = *undoad; 
    undoad = &current->next; 
    if (undo) undo->next = current->next; 
    } 
    cnt++; 
} 

然而,可能上面是memory leak:您可能需要使用delete地方。

+0

我不能伤心地:( 我必须使用单独链接列表 – WombatCombat