删除单个链表的每个't'(t> 1)节点。在结果链表中,再次删除't'节点。重复此操作直到只剩下t-1个节点。
为此,我想出了: 遍历到达第t个节点,删除所有节点直到结束。 除此之外还有什么有效的方法吗?任何人都可以帮助我。感谢。
答案 0 :(得分:2)
这听起来是正确的,算法将是O(n)。
确保您正在删除第t个节点,因为您只想保留t-1个节点。
听起来他们希望你一次删除1个节点,直到不存在任何节点为止。他们可能希望您一次执行1个这样的操作,这样您就可以为要删除的节点调用delete
C ++或free
。
答案 1 :(得分:2)
这很可能是一个循环重复删除。因此,除非mod t的节点数为0,否则您可能需要逐个“遍历”它们。
t = 4
A-> B-> C-> D-> E-> F-> G-> H-> I-> J => K-> 1→ ;米
这里d,h,l进入第一次迭代
c,我在第二个,依此类推。
当然,除了实际遍历之外,您可以计算在单独数组中存活的节点数,然后通过一次实际遍历删除killees。
答案 2 :(得分:1)
这个问题的措辞相当奇怪,因为当你刚刚离开t-1节点时,重复删除第t个元素是什么意思?这是一个功课问题吗?你确定你已经正确理解了吗?如果问题确实是正确的并且你关心的是最终结果,那么做你所说的 - 从t到最后删除所有节点,确实是最有效的方法。唯一要考虑的是该问题指定了删除项目的特定顺序,而您无视该顺序。
答案 3 :(得分:0)
删除t-1之后的所有节点。
证明可能是真正的功课。
答案 4 :(得分:0)
如果你必须删除每个't'节点,你必须浏览你的列表,直到你找到't'元素,然后执行以下操作:
while (actual.next != NULL)
{
auxiliar = actual.next;
actual.next = actual.next.next;
free(auxiliar);
}
在上面的代码中,auxiliar是节点类型,实际是'(t-1)'元素,但我认为这与你的代码没有什么不同。
之前关于将'(t-1)'节点指向NULL的注释无法解决问题,因为我们想要删除这些节点,而不仅仅是丢失它们的地址而且Pieter对于这个事实是正确的导致内存泄漏(这将是你的敌人很长一段时间)。
答案 5 :(得分:0)
/* ASSUMPTION declarations */
struct lnk_struct { int payload; struct lnk_struct * pnext; };
typedef struct lnk_struct LINK;
/* ASSUMPTION function prototypes */
LINK * some_func_returns_list(void); /* gives us the initial list */
int gimme_t(void); /* gives us value of t */
void discard_link( LINK * p ); /* frees/deletes a link */
/* IMPLEMENTATION wrapped in a procedure*/
void assignment(void)
{
int t = gimme_t();
LINK * list = some_func_returns_list();
LINK * current, * tail;
current = list;
/* advance current until it is t-1 'th element */
for( /*homework you code it */)
{
current = current->pnext;
}
tail = current->pnext;
current->pnext = NULL;
/* now list ends where you want */
/* you still need to delete the tail items */
while( /* homework */ )
{
/* remove one link from list/
discard_link( /* the removed link */ );
}
}