Day 3:从尾到头打印链表

时间:2022-07-24
本文章向大家介绍Day 3:从尾到头打印链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——从尾到头打印链表

题目描述:

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体思路:

思路1: 1、先构造一个链表 2、定义一个栈,将链表元素放入到栈中 3、利用栈的先进后出,实现从尾到头返回 4、取出栈中元素放入到ArrayList,然后遍历   我们用java来实现这个思路:

import java.util.ArrayList;
public class Solution{
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<Integer>();
		ArrayList<Integer> result = new ArrayList<Integer>();
		ListNode temp = listNode;//这里需要构造一个ListNode类
		while ( temp != null ) {//需要先判断链表时候为空
			list.add( temp.val );//定义节点
			temp = temp.next;
		}
		for ( int i = list.size()-1; i>=0; i-- ) {
			result.add( list.get(i) );//遍历获得一个 ArrayList链表输出。
		}
		return result;
    }
}

  其效果如图所示:

思路2:让尾结点与头结点进行交换,然后让之前的数据插入到头指针之前 我们用python来实现这个思路

class Solution:
	def printListFromTailToHead(self, listNode):
		ret = []
		pTmp = listNode
		while pTmp:
			ret.insert(0, pTmp.val)
			pTmp = pTmp.next
		return ret

  其效果如图所示:

思路3:开辟一个新的list空间,将输入的链表list进行遍历,逆序并返回。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
# Python 2.7
 
class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        l = list()
        while listNode:
            l.append(listNode.val)
            listNode = listNode.next
        num = len(l)
        ArrayList = []
        while (num > 0):
            ArrayList.append(l[num-1])
            num -= 1
        return ArrayList
        # write code here

  在思路3的基础上我们继续缩小代码量。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
# Python 2.7
 
class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        l = list()
        while listNode:
            l.append(listNode.val)
            listNode = listNode.next
        return l[::-1]  #更简单的代码
        # write code here

总结

  本道题主要考察链表的相关知识,包括链表的逆序,还有栈和链表的相结合,达到链表的从尾到头输出。不过这里需要注意的是,在这道题中,listNode表示的是一个链表的节点,节点含有值和下一个节点指针,不能取len,更不能进行迭代。因此,我们在代码中用的是while()语句,而不是for()。同时,还是和之前两道题一样,任何一道编程题的代码、方法都不是唯一的,没有标准的答案,只是参考。思路不一样决定代码就不一样。因此我们要不断拓宽我们的思路,只有思路正确,才能写出正确的代码。继续加油,争取早日找到工作,Good Luck!!!