【发布时间】:2020-05-05 18:39:15
【问题描述】:
这里使用函数returnReverseLinkedList 我返回给定链表的反向链表。但是这种方法的问题是我丢失了原始链表。因此,我创建了另一个名为 createReversedLinkedList 的函数来创建 copy of the original linked list 和 reverse the copy 并保持对两者的拥有。
不幸的是createReversedLinkedList 正在给Runtime error。
显然我的最终目标是检查if the given linked list is palindrome or not。这个问题只是一个垫脚石。
谁能告诉我为什么?
//Check if a linked list is a palindrome
#include <iostream>
using namespace std;
class node
{
public:
int data;
node *next;
node(int data)
{
this->data = data;
this->next = NULL;
}
};
node *returnReverseLinkedList(node *head)
{
// Will Lose original Linked List
if (head == NULL)
return NULL;
else if (head != NULL && head->next == NULL)
return head;
node *prev = NULL;
node *curr = head;
node *tempNext = head->next;
while (tempNext != NULL)
{
curr->next = prev;
prev = curr;
curr = tempNext;
tempNext = tempNext->next;
}
curr->next = prev;
return curr;
}
node *createReversedLinkedList(node *head)
{
if (head == NULL)
return NULL;
else if (head != NULL && head->next == NULL)
return NULL;
else
{
node *temp = head;
node *newHead = NULL;
node *newTail = NULL;
while (temp != NULL)
{
node *newNode = new node(temp->data);
if (newHead == NULL)
{
newHead = newNode;
newTail = newNode;
}
else
{
newTail->next = newNode;
newTail = newNode;
}
}
return returnReverseLinkedList(newHead);
}
}
bool check_palindrome(node *head)
{
node *original = head;
node *reverse = returnReverseLinkedList(head);
while (original->next != NULL || reverse->next != NULL)
{
if (original->data != reverse->data)
return false;
cout << "debug 2" << endl;
original = original->next;
reverse = reverse->next;
}
return true;
}
// #include "solution.h"
node *takeinput()
{
int data;
cin >> data;
node *head = NULL, *tail = NULL;
while (data != -1)
{
node *newnode = new node(data);
if (head == NULL)
{
head = newnode;
tail = newnode;
}
else
{
tail->next = newnode;
tail = newnode;
}
cin >> data;
}
return head;
}
void print(node *head)
{
node *temp = head;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
int main()
{
node *head = takeinput();
node *revese2 = createReversedLinkedList(head);
print(revese2);
// bool ans = check_palindrome(head);
// if (ans)
// cout << "true";
// else
// cout << "false";
// return 0;
}
【问题讨论】:
-
注意:std::reverse 已经存在。
-
你永远不会改变
temp。while (temp != NULL)始终为真,您的循环将永远运行,或者更确切地说,直到内存不足。 -
除了 Igor 的批判性观察之外,
return NULL;可能在空头指针的开头情况下是正确的,但在单节点列表的情况下可能不正确,其中“逆转”只是同一个节点。至于实际制作反向副本,向前遍历原始副本,并像 stack 一样构建副本(例如,将原始列表的复制的向前遍历节点推 backward i> 在新列表的头部)。这也完全消除了对returnReversedLinkdList调用的需要。 -
@WhozCraig 你能简单点吗?
-
@IgorTandetnik 彻底解决了问题
标签: c++ recursion data-structures linked-list