输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
java 递归超简洁版本
public class Solution {
ArrayList<Integer> arrayList=new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
this.printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);
}
return arrayList;
}
}
# python的实现这么少, 我来添砖加瓦 # 1.先遍历链表元素到栈 # 2.栈再弹出
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code here lst,lst_bak = [],[] if not listNode: return lst while listNode: lst.append(listNode.val) listNode = listNode.next while lst: lst_bak.append(lst.pop()) return lst_bak
# -*- coding:utf-8-*-# classListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:# 返回从尾部到头部的列表值序列,例如[1,2,3]def printListFromTailToHead(self, listNode):# write code hereresult = []iflistNode is None:returnresultwhilelistNode.next is not None:result.extend([listNode.val])listNode=listNode.nextresult.extend([listNode.val])returnresult[::-1]
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(listNode==null)
return list;
get(listNode, list);
return list;
}
public void get(ListNode listNode,ArrayList<Integer> list){
if(listNode.next==null){
list.add(listNode.val);
return;
}
get(listNode.next, list);
list.add(listNode.val);
}
}
}
public class LinkedList {
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ListNode list = new ListNode(0);
ListNode cursor = listNode;
ListNode top = list;
ArrayList<Integer> result = new ArrayList<Integer>();
while(cursor!=null){
ListNode temp = new ListNode(cursor.val);
temp.next = top;
top = temp;
cursor = cursor.next;
}
while(top!=null){
result.add(top.val);
top = top.next;
}
result.remove(result.size()-1);
return result;
}
}
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//用来存储链表中节点的值。
Stack<Integer> reverse = new Stack<>();
while(listNode != null){
reverse.push(listNode.val);
listNode = listNode.next;
}
//创建的题目要求的数据类型来存储反向的节点值。
ArrayList<Integer> result = new ArrayList<>();
while(!reverse.isEmpty()){
//将值从栈中弹出,并添加到ArrayList中
result.add(reverse.pop());
}
return result;
}
} import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<ListNode> stack = new Stack<ListNode>();
ArrayList<Integer> list=new ArrayList<Integer>();
ListNode current=listNode;
while(current!=null){
stack.push(current);
current=current.next;
}
while(!stack.isEmpty()){
list.add(new Integer(stack.pop().val));
}
return list;
}
}
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
helper(res, listNode);
return res;
}
private void helper(ArrayList<Integer> res, ListNode head) {
if (head != null) {
if (head.next != null) {
helper(res, head.next);
}
res.add(head.val);
}
}
从尾到头,即先进后出,使用栈。注意,JDK推荐使用Deque代替Stack。
public ArrayList<Integer> printListFromTailToHead2(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
Deque<Integer> stack = new ArrayDeque<>();
while (listNode != null) {
stack.push(listNode.val);
listNode = listNode.next;
}
while (!stack.isEmpty()) {
res.add(stack.pop());
}
return res;
}
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list=new ArrayList<Integer>();
while(listNode!=null)
{
list.add(0,listNode.val);
listNode=listNode.next;
}
return list;
}
} 定义一个集合,遍历链表,每次都放在集合的第一个,返回集合,但是这样时间复杂度就有点高了
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* pHead)
{
vector<int> rst;
while(pHead != nullptr)
{
rst.push_back(pHead->val);
pHead = pHead->next;
}
int sz = rst.size();
for(int i = 0; i < (sz>>1); ++i)
{
rst[i] ^= rst[sz-1-i];
rst[sz-1-i] ^= rst[i];
rst[i] ^= rst[sz-1-i];
}
return rst;
}
}; 直接翻转容器中的数据。用到了三次异或位运算交换首位对称的元素;也可以用<algorithm>里的reverse(rst.begin(),rst.end());
就地反转 不依靠别的结构
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList list=new ArrayList();
if(listNode==null) return list;
ListNode dummy=new ListNode(0);
dummy.next=listNode;
ListNode cur=listNode;
// 链表就地反转
while(cur.next!=null)
{
ListNode temp=cur.next;
cur.next=temp.next;
temp.next=dummy.next;
dummy.next=temp;
}
ListNode head=dummy.next;
while(head!=null)
{
list.add(head.val);
head=head.next;
}
return list;
}
}
利用栈
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList list=new ArrayList();
if(listNode==null) return list;
Stack<ListNode> s=new Stack<>();
while(listNode!=null)
{
s.push(listNode);
listNode=listNode.next; }
while(!s.isEmpty())
{
list.add(s.pop().val);
}
return list;
}
}
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { vector<int> value; if(head != NULL) { value.insert(value.begin(),head->val); if(head->next != NULL) { vector<int> tempVec = printListFromTailToHead(head->next); if(tempVec.size()>0) value.insert(value.begin(),tempVec.begin(),tempVec.end()); } } return value; } };/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { vector<int> value; if(head != NULL) { value.insert(value.begin(),head->val); while(head->next != NULL) { value.insert(value.begin(),head->next->val); head = head->next; } } return value; } };