Создание второго односвязного списка в обратном порядке другого списка - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужно создать функцию, которая принимает обычный односвязный список и создает другой список в обратном порядке первого списка, первый элемент в новом списке будет последним элементом в исходном списке и так далее.

Моя функция по какой-то причине только и снова возвращает одно и то же число снова и снова для всего нового списка.Поэтому, если последнее число в моем исходном списке, например, «50», новый список будет полностью состоять из «50».

Это мой код, что я делаю не так?Если кто-то хочет, чтобы я опубликовал всю программу для большей ясности или контекста, напишите мне.

void invert() {
    node *list1=top,*newlist,*temp,*prev;
    while (list1->next!=NULL) {
        list1=list1->next;
    }
    newlist=new node;
    newlist->num=list1->num;
    newlist->next=NULL;
    if (top2==NULL) {
        top2=newlist;
    }
    else {
        for (temp=top2;temp!=NULL;temp=temp->next) {
            prev=temp;
        }
        prev->next=newlist;
    }
    list1->next=NULL;
}

1 Ответ

0 голосов
/ 12 февраля 2019

Ваш код не может быть корректным, поскольку он создает только один новый узел и затем изменяет следующую ссылку в существующих узлах.Исходя из ваших требований, вы должны создать новый список, который означает клонирование всех узлов и связывание их в обратном порядке.

Следуя предложению @ user4581301, я пришел к следующему:

node* invert(node* list)
{
    node* inverted = NULL;
    // run through original in order
    for (node* p = list; p != NULL; p = p->next) 
    {
        // clone the node
        node* newNode = new node(); 
        newNode->num = p->num;
        // and link it so that the predecessor in the original list
        // (which has been processed in the previous iteration) is
        // linked as next node
        newNode->next = inverted;
        inverted = newNode;
    }
    return inverted;
}
...