基本思路:
通常,这种情况下,我们不希望修改原链表的结构。返回一个反序的链表,这就是经典的“后进先出”,我们可以使用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,给一个新的链表结构,这样链表就实现了反转。
#include <vector>
#include <list>
#include <stack>
#include <iostream>
#include <stdio.h>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL)
{
}
};
class Solution {
public:
vector<int> printlistFromTailToHead(ListNode* head) {
stack<int> nodes;
vector<int> result;
ListNode* node = head;
while (node != NULL) {
nodes.push(node->val);
node = node->next;
}
while (!nodes.empty()) {
result.push_back(nodes.top());
nodes.pop();
}
return result;
}
}
上面只编写了链表的反转方法,测试方法正确性需要增加链表初始化:
class Solution {
public:
vector<int> printlistFromTailToHead(ListNode* head) {
stack<int> nodes;
vector<int> result;
ListNode* node = head;
while (node != NULL) {
nodes.push(node->val);
node = node->next;
}
while (!nodes.empty()) {
result.push_back(nodes.top());
nodes.pop();
}
return result;
}
ListNode* initializeNodeList(vector<int> &input) {
ListNode *node =(ListNode*)malloc(sizeof(ListNode)*input.size());
for(int i = 0;i<input.size();i++)
{
int j = input[i];
ListNode temp(j);
if(i<input.size()-1)
temp.next = &node[i + 1];
node[i] = temp;
}
return node;
}
};
最后在main跑起来:
void main()
{
Solution A;
ListNode *B;
vector<int> C;
vector<int> b{ 1,2,3,4,5,6,7,8};
B = A.initializeNodeList(b);
C = A.printlistFromTailToHead(B);
for (int i = 0; i < C.size(); i++)
{
cout << C[i]<<endl;
}
int p;
cin >> p;
}
打印结果: