链表问题

时间:2010-06-06 16:01:23

标签: c++ c

删除单个链表的每个't'(t> 1)节点。在结果链表中,再次删除't'节点。重复此操作直到只剩下t-1个节点。

为此,我想出了: 遍历到达第t个节点,删除所有节点直到结束。 除此之外还有什么有效的方法吗?任何人都可以帮助我。感谢。

6 个答案:

答案 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 */ );
        }
  }