Удаление последнего элемента LinkedList - PullRequest
0 голосов
/ 27 мая 2018

Я пишу программу, и частью этой программы является функция, которая должна удалить последний элемент в LinkedList:

struct node *del_the_last(struct node *head) {
struct node *h1 = head;
if (head == NULL) { 
    return NULL; 
}
while (head->next != NULL) {
    head = head->next;
}
free(h1); 
return head;
}

При заданных значениях:

16, 7, 8, 12, 13, 19, 21, 12

моя программа возвращает

[12]

однакодолжен удалить его.Поэтому я попробовал еще раз, и это самое близкое, что я получил:

struct node *del_the_last(struct node *head) {
    struct node *h1 = head;
    int flag = 1;
    if (head == NULL) { return NULL; }
    while (flag == 1) {
        if (head->next->next == NULL) {
            flag = 0;
            head->next = NULL;
            free(h1);
            return head;

        }
        else {
            head = head->next;
        }

    }

}

Учитывая вывод:

2,7,1,8

Моя программа возвращает:

1

Также я подтвердил, что значение:

8

Удаляется из LinkedList при попытке вернуть head-> next, которое вернуло ошибку

Я знаю, как поступить с решением этой проблемы, но я не уверен, как перевести это в C-код.

Это то, что нужно сделать моей программе:

  1. Сохранить указатель на начало узла (* head) в переменную
  2. Позвольте программе работатькак обычно, т.е. код выше
  3. Присвойте заголовку значение указателя в шаге # 1
  4. свободный указатель
  5. Возврат головки

Я считаю, что это то, что нужно сделать, но я не уверен, как это сделать

Пожалуйста, посоветуйте мне правильный путь

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Как указал @achal, это может быть проблематично, если head->next равен NULL при выполнении head->next->next.

struct node* del_the_last(struct node* head){
    struct node* curr = head;
    // Check if head is NULL
    if(head == NULL){
        return NULL;
    }
    // Special case if head is the only node in the list
    if(head->next == NULL){
        free(head);
        return NULL;
    }
    while(curr != NULL){
        /* Check if curr->next is not NULL. If it's not, 
           see if curr->next->next is NULL, if so, then you 
           know that curr->next is the last node.
        */ 
        if(curr->next != NULL && curr->next->next == NULL){
            free(curr->next);
            /* Important to NULL the link to the delete node 
               so as to signify that now curr->next is the last node
            */ 
            curr->next = NULL; 
        }else{
            curr = curr->next;
        }
    }
    return head;
}
0 голосов
/ 27 мая 2018

Ниже приведен пример вашего измененного кода.Я пытался объяснить в комментариях.

struct node *del_the_last(struct node *head) {
        struct node *h1 = head,*temp = NULL;
        if(h1 != NULL) { /* first check head node is NULL or not */
                if(h1->next != NULL) { /* then check head->next */ 
                        while(h1->next->next != NULL) {         
                                h1 = h1->next; /* h1 holds previous of last node when while loop terminates */
                        }
                        temp = h1->next; /*to free last node, assign h1->next to temp */        
                        h1->next = h1->next->next; /* update the previos of last node */
                        free(temp);
                        temp = NULL;
                        return head;

                }
                else { /* if there is only one node in the linked list */
                        head = h1->next; /* make head as NULL */
                        free(h1); /* free temp ptr */
                        h1 = NULL; /* assign it to zero,to avoid memory leakage */
                        return head;
                }

        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...