标签:微信 tree tco 学校 完整 工作 良好的 例子 整数
重磅干货,第一时间送达从尾到头打印链表
输入一个链表的头结点,从尾到头反过来打印出每个结点的值
要想从尾到头遍历链表,首先需要做的是倒转链表,再进行遍历。
该题思路:创建一个空列表,用来存储链表中的值,最后将列表逆序输出
下面我们来举个例子:
题目要求,从尾到头遍历单链表。也就是第一个遍历到的节点要最后一个输出,最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,由此可借助栈实现这种顺序。
每经过一个结点的时候,把该结点放到一个栈中。
当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
递归在本质上就是一个栈结构。
要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
但有个问题:
当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。
# -*- 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
if not listNode:
return []
result = []
while listNode.next is not None:
# extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
result.extend([listNode.val])
listNode = listNode.next
# 退出循环刚好在末尾节点,将末尾节点也添加进去
result.extend([listNode.val])
return result[::-1]
c++的vector可以用insert()函数来向指定位置插入元素,arr.begin()表示在头部,arr.end()表示在尾部。例如:
//在头部插入10
arr.insert(arr.begin(),10);
//在尾部插入8
arr.insert(arr.end(),8);
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> arr;
while(head){
arr.insert(arr.begin(),head->val);
head = head->next;
}
return arr;
}
};
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//使用 栈 这种数据结构
Stack<Integer> stack = new Stack<>();
//将链表元素全部存放在 栈 里面
while (listNode != null) {
stack.add(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> ret = new ArrayList<>();
//取出栈里面的元素
while (!stack.isEmpty())
ret.add(stack.pop());
return ret;
}
}
注:面试季来了,不管是作为面试者还是以后作为面试官,了解算法这门程序员之间的沟通方式都是非常必要的。找过工作的朋友应该都听说过《剑指offer》,虽然书中只有六十多道题目,但是道道都是经典。
如果是单纯的面试需求,剑指offer的优先级肯定是在Leetcode之前,总的说它有三个优点:
它的缺点是:
剑指offer刷题交流群
扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆)
▲长按加群
每日算法题 | 剑指offer 链表专题 (4) 从尾到头打印链表
标签:微信 tree tco 学校 完整 工作 良好的 例子 整数
原文地址:https://blog.51cto.com/15054042/2564443