从尾到头打印链表
从尾到头打印链表
题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
版本一: 没什么技术含量, 利用vector数组简单交换头尾数子
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ret;
        ListNode *current = head;
        int low = 0;
        int high = 0;
        
        if (NULL == head) {
            return ret;
        }
        
        while (NULL != current) {
            ret.push_back(current->val);
            current = current->next;
        }
        
        high = ret.size() - 1;
        
        while (low < high) {
            ret[low] = ret[low] + ret[high];
            ret[high] = ret[low] - ret[high];
            ret[low] = ret[low] - ret[high];
            low++;
            high--;
        }
        
        return ret;
    }
};
版本二: 利用栈的先进后出的思想来交换头尾数字
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        stack<int> sk;
        vector<int> ret;
        ListNode *current = head;
        
        while(NULL == head) {
            return ret;
        }
        
        while(NULL != current) {
            sk.push(current->val);
            current = current->next;
        }
        
        while(!sk.empty()) {
            ret.push_back(sk.top());
            sk.pop();
        }
        return ret;
    }
};
版本三: 利用递归, 源自牛客网
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> dev;    
    vector<int> printListFromTailToHead(ListNode* head) {
        if(head!=NULL) {
          if(head->next!=NULL) {
            dev=printListFromTailToHead(head->next);
          }
          dev.push_back(head->val);
        }
        return dev;
    }
};
版本四: 自己在vs上写的, 不知道为何提交到牛客上不能通过
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
struct ListNode {
	int val;
	struct ListNode *next;
};
vector<int> ret;
vector<int> printArray(ListNode* head, vector<int> &v) {
	if (NULL != head->next) {
		v = printArray(head->next, v);
	}
	v.push_back(head->val);
	//cout << head->val << endl;
	return v;
}
vector<int>& printListFromTailToHead(ListNode* head) {
	ret = printArray(head, ret);
	return ret;
}
void main(void) {
	ListNode n1, n2, n3;
	vector<int> ret;
	n1.val = 1, n2.val = 2, n3.val = 3;
	n1.next = &n2;
	n2.next = &n3;
	n3.next = NULL;
	ret = printListFromTailToHead(&n1);
	for (int i = 0; i < ret.size(); i++) {
		cout << ret[i] << endl;
	}
}
                    
                
                
            
        
浙公网安备 33010602011771号