编程语言
首页 > 编程语言> > 每日算法题 | 剑指offer 链表专题 (4) 从尾到头打印链表

每日算法题 | 剑指offer 链表专题 (4) 从尾到头打印链表

作者:互联网

重磅干货,第一时间送达

每日算法题 | 剑指offer 链表专题 (4) 从尾到头打印链表

题目

从尾到头打印链表

题目要求

输入一个链表的头结点,从尾到头反过来打印出每个结点的值

解题思路

要想从尾到头遍历链表,首先需要做的是倒转链表,再进行遍历。
该题思路:创建一个空列表,用来存储链表中的值,最后将列表逆序输出
下面我们来举个例子:
每日算法题 | 剑指offer 链表专题 (4) 从尾到头打印链表

使用栈的情况:

题目要求,从尾到头遍历单链表。也就是第一个遍历到的节点要最后一个输出,最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,由此可借助栈实现这种顺序。
每经过一个结点的时候,把该结点放到一个栈中。
当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。

使用递归:

递归在本质上就是一个栈结构。

要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。

但有个问题:
当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。

代码实现

Python :

# -*- 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++

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;
    }
};

JAVA

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) 从尾到头打印链表
▲长按加群

每日算法题 | 剑指offer 链表专题 (4) 从尾到头打印链表

标签:结点,listNode,offer,arr,next,链表,二叉树,从尾
来源: https://blog.51cto.com/15054042/2564443