为什么在此C ++代码中触发此if语句?

时间:2020-06-20 16:34:36

标签: c++ linked-list singly-linked-list

该代码应反向链接列表。即使提供了非空列表,以下代码也将返回一个空链表。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* curr, *prev, *next;
        if (head == NULL)
        {
            return head;   
        }   
        curr = head;
        prev = NULL;
        while (curr != NULL)
        {
            next = curr -> next;
            curr -> next = prev;
            prev = curr;
            curr = next;
        }
        head = prev;
        return head;
    }
};

虽然这段代码奇怪地起作用,但我在其中添加了一个cout语句只是为了检查是否触发了其他语句。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* curr, *prev, *next;
        if (head == NULL)
        {
            cout << "Triggered";
            return head;   
        }   
        curr = head;
        prev = NULL;
        while (curr != NULL)
        {
            next = curr -> next;
            curr -> next = prev;
            prev = curr;
            curr = next;
        }
        head = prev;
        return head;
    }
};

有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

非常简单,您必须初始化pointers,否则会导致意外的行为,包括根本不显示它,或者如果触发了初始化的cout则仅显示它-但它不会必须做任何事情,这取决于您的编译器实现。

//cpp17
    listNode* curr{}, *prev{}, *next{};

//before
    listNode* curr = nullptr, *prev = nullptr, *next = nullptr;

它仍然不是您想要的相反顺序。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        listNode* curr{}, *prev{}, *next{};
        //ListNode* curr, *prev, *next;
        if (head == NULL)
        {
            return head;   
        }   
        curr = head;
        prev = NULL;
        while (next != NULL)
        {
            next = curr -> next;
            curr -> next = prev;
            prev = curr;
            curr = next;
        }
        head = prev;
        return head;
    }
};

欢呼:)

答案 1 :(得分:1)

就像我之前提到过的那样,我花时间为解决您的问题的另一种方法编写解决方案,以通过类来反向链接列表。为了让初学者更好地理解,我跳过了三/五规则,并在主函数中而不是通过类中的构造函数初始化了列表:

#include <iostream>

class listElement
{
    std::string data;
    listElement* next;
    listElement* last;


public:
    void setData(std::string);
    void append(std::string);
    void displayElements();
    void reverseDisplayElements(listElement*);
    void freeMemory();

    listElement* reverseList(listElement*);
};

void listElement::setData(std::string newData)
{
    last = this;
    data = newData;
    next = nullptr;
}

void listElement::append(std::string newData)
{
// Double linked list
//    last->next = new listElement();
//    last->next->data = newData;
//    last->next->next = nullptr;
//    last = last->next;

// Singly linked list
    //has next the value nullptr?
    //If yes, next pointer
    if (next == nullptr)
    {
        next = new listElement();
        next->data = newData;
        next->next = nullptr;
    }
    //else the method again
    else
        next->append(newData);
}

listElement* listElement::reverseList(listElement* head)
{
    //return if no element in list
    if(head == nullptr)
        return nullptr;

    //initialize temp
    listElement* temp{};

    while(head != nullptr){
        listElement* next = head->next;
        head->next = temp;
        temp = head;
        head = next;
    }
    return temp;
}

void listElement::displayElements()
{
    //cout the first entry
    std::cout << data << std::endl;
    //if the end is not reached, call method next again
    if (next != nullptr)
        next->displayElements();
}

void listElement::reverseDisplayElements(listElement*head)
{
    //recursiv from the last to the list beginning - stop
    listElement *temp = head;

    if(temp != nullptr)
    {
        if(temp->next != nullptr)
        {
            reverseDisplayElements(temp->next);
        }
      std::cout << temp->data << std::endl;
    }
}
void listElement::freeMemory()
{
    //If the end is not reached, call the method again
    if (next != nullptr)
    {
        next->freeMemory();
        delete(next);
    }
}

int main ()
{
    //Pointer to the Beginning of the list
    listElement* linkedList;

    //Creating the first element
    linkedList = new listElement();
    //Write data in the first element
    linkedList->setData("Element 1");

    //add more elements
    linkedList->append("Element 2");
    linkedList->append("Element 3");
    linkedList->append("Element 4");

    //display list
    linkedList->displayElements();

    //space divider
    std::cout << "\nPrint in reverse order:" << std::endl;

    //display list in reverse order
    //pass list beginning as stop point
    linkedList->reverseDisplayElements(linkedList);
    std::cout << std::endl;

    linkedList->displayElements();
    std::cout << "\nReverse elements:" << std::endl;

    linkedList = linkedList->reverseList(linkedList);
    linkedList->displayElements();

    std::cout << std::endl;

    //destruct the list and free memory
    linkedList->freeMemory();
    delete(linkedList);

    return 0;
}

顺便说一句。 there are many different solutions完成该任务。