我编写了代码,以删除链表末尾的节点。该代码可以在不同的测试用例中正常工作,但是我认为我的代码有点麻烦。但是,我看不出可以做些什么?

node_t *remove_t (node_t *l){
if (l==NULL){
    return l;
}
else {
    node_t *curr=l;
    node_t *ret=l;
    if (curr->next==NULL){
        l=NULL;
        return l;
    }
    else {
        while (curr->next->next!=NULL){
            curr=curr->next;
        }
        curr->next=NULL;
        free(curr->next);
        return ret;
    }
}
}

最佳答案

我不确定您是否可以更改逻辑,因为您处理3种不同情况(空列表,包含1个项目的列表以及包含1个以上项目的列表)的方法是合理的。您可以设置代码格式以便于阅读:

node_t *remove_t (node_t *l){
    // case 1: Empty list
    if (l==NULL){
        return l;
    } ;

    // case 2: List with one item. Return empty list.
    node_t *curr=l;
    if (curr->next==NULL){
        // Remember to free this element.
        free(curr) ;
        l=NULL;
        return l;
    } ;

    // case 3: list > one item
    // Move curr to last item
    while (curr->next->next!=NULL){
        curr=curr->next;
    }
    // Note order of free/null setting.
    free(curr->next);
    curr->next=NULL;

    return l;
}

关于c - 删除链表C尾部的节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58274796/

10-10 21:37