我正在研究与反转链接列表部分相关的代码。对于反转部分,我使用的算法是将列表的节点推送到堆栈,然后继续弹出堆栈并更正每个节点的下一个指针。我遇到的问题是使用STL堆栈提供了比函数调用堆栈更好的性能,反之亦然。
我原本期望STL堆栈的性能更好,因为调用函数堆栈还有其他开销,但是从提交细节来看似乎不然。我错过了什么,或者功能堆栈是否表现得更好?
感谢您提供的任何帮助。
附加代码,万一有人想看看。函数之间反向的参数是列表的头部,以及两个索引(包括1,包括),在这两个索引之间应该反转节点。我认为你不需要查看代码:
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n)
{
int counter = 1;
stack<ListNode*> holder;
ListNode* current = head;
ListNode* pre_flip = NULL;
ListNode* to_return = head;
while (counter < m)
{
pre_flip = current;
current = current->next;
counter++;
}
while (counter <= n)
{
holder.push(current);
if (counter != n)
current = current->next;
counter++;
}
if (m == 1)
to_return = current;
ListNode* post_flip;
post_flip = current->next;
if (pre_flip == NULL)
pre_flip = to_return;
while (holder.empty() == 0)
{
ListNode* temp = holder.top();
pre_flip->next = temp;
pre_flip = pre_flip->next;
holder.pop();
}
pre_flip->next = post_flip;
return to_return;
}
};