链表反向函数OOP C++

Linked List Reverse Function OOP C++

本文关键字:OOP C++ 函数 链表      更新时间:2023-10-16

我正在为链表编写一个反向函数,但我不知道如何指向列表中新的第一个数字。在main中声明head为ListNode*并通过引用传递它将不起作用,因为我有很多其他函数不想修改。有其他方法吗?这是我的头文件:

// Specification file for the NumberList class
#ifndef NUMBERLIST_H
#define NUMBERLIST_H
class NumberList
{
private:
   // Declare a structure for the list
   struct ListNode
   {
      double value;           // The value in this node
      struct ListNode *next;  // To point to the next node
   };
   ListNode *head;            // List head pointer
public:
   // Constructor
   NumberList()
      { head = nullptr; }
   // Destructor
   ~NumberList();
   // Linked list operations
   void appendNode(double);
   void insertNode(double);
   void deleteNode(double);
   int searchList(double);
   void reverseList() const;
   void displayList() const;
};
#endif

这是反向函数。放置head=previousNode将不起作用:

void NumberList::reverseList() const
{
    ListNode *currentNode;              // points to current node
    ListNode *previousNode = nullptr;   // stores address of previous node
    ListNode *nextNode = nullptr;       // stores the address of next node
    ListNode *tempNode = nullptr;       // 
    currentNode = head;
    while (currentNode != nullptr)
    {
        cout << "current value: " << currentNode->value << endl;
        nextNode = currentNode->next;
        currentNode->next = previousNode;
        previousNode = currentNode;
        currentNode = nextNode;
    }
    //head = previousNode;
}

*编辑:添加在main()中

#include <iostream>
#include <fstream>
using namespace std;
#include "NumberList.h"
int main()
{
    NumberList nList;
    ifstream inFile;
    double number;
    double searchedNum;
    inFile.open("input.txt");
    if (!inFile)
    {
        cout << "File could not be opened!" << endl;
    }
    else
    {
        while (inFile >> number)
        {
            nList.appendNode(number);
        }
        cout << "The list after file reading:" << endl;
        nList.displayList();
        cout << "What number would you like to search for? ";
        cin >> searchedNum;
        cout << "Position: " << nList.searchList(searchedNum) << endl;
        cout << "The list after reversing:" << endl;
        nList.reverseList();
        nList.displayList();
    }

    return 0;
}

这里有一个迭代版本(我用// Added *标记了更改):

void NumberList::reverseList()
{
    ListNode *currentNode;              // points to current node
    ListNode *previousNode = nullptr;   // stores address of previous node
    ListNode *nextNode = nullptr;       // stores the address of next node
    currentNode = head;
    ListNode* temp; // Added*
    while (currentNode != nullptr)
    {
        temp = currentNode->next; // Added *
        nextNode = currentNode->next;
        currentNode->next = previousNode;
        previousNode = currentNode;
        currentNode = temp; // Added *
    }
}
ListNode * reverse_list(ListNode * list, ListNode * new_head = nullptr)
{
    if (list == nullptr) return new_head;
    ListNode * tmp = list->next;
    list->next = new_head;
    return reverse_list(tmp, list);
}
head = reverse_list(head);