【Python学习-链表-insert-append-reverse】【剑指offer】之从尾到头打印链表

【Python学习-链表-insert-append-reverse】【剑指offer】之从尾到头打印链表

问题

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

知识储备

关于链表的介绍可以参考link
关于链表的操作可以参考link

问题分析

了解了链表的基本操作之后,如何实现倒序输出呢,当我们在遍历链表的时候,用列表来存储每次访问的节点数据值,最后用insert-append-reverse均可以实现。

代码

先遍历链表保存到列表中,最后用reverse反转列表顺序即可。

# -*- 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
        l = []
        h = listNode  # 链表结构的指针
        while h:      # 开始遍历链表
            l.append(h.val)  # 在l列表增加h指针的数据值
            h = h.next       # 指针移动到下一位 经过循环得到所有值
        l.reverse()    # 但是正序的,需要的是倒序输出 所以reverse
        return l

或者:

# -*- 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
        result = []
        if listNode is None:
            return result
        while listNode.next is not None:
            result.append(listNode.val)
            listNode = listNode.next
        result.append(listNode.val)
        return result[::-1] # 倒序输出

遍历的时候,指定0位置插入该指针对应的值,这样就可以直接完成倒序的列表,不需要reverse。

# -*- 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
        l = []
        head = listNode  # head就是游标
        while head:
            l.insert(0, head.val)# 每次的值都插在0位置,即实现了倒序
            head = head.next  # 实现游标移动
        return l

递归方法

不断递归找到最后一个指针然后列表增加倒回去的指针对应的数据。

class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        list = []
        if listNode:
            list = self.printListFromTailToHead(listNode.next)
            list.append(listNode.val)
        return list

更多详情可参考link

关于链表

实现一个简单的链表,详情参考link
在这里插入图片描述
在这里插入图片描述

class LinkedListNode(object):
    def __init__(self,next=None,value=None):
        self.next = next
        self.value = value
pHead = LinkedListNode()   # 空头节点 指针域没有指向
myList = [1,2,3,4,5,6,7,8,9]  # 列表用来添加节点
for i in range(len(myList)):
    pHead = LinkedListNode(pHead,myList[i])  # 将列表的值指向空头节点 并返回这个新节点的指针域 如此循环  9->8->7->6->5->4->3->2->1->空头节点

实现倒序输出

def printLinkedList(pHead):   #pHead 为创建好的链表结构 9->8->7->6->5->4->3->2->1
    if pHead.value==None:
        return False
    printLinkedList(pHead.next)  # 递归找到最后一个指针,依次返回指针对应的值,实现倒序输出
    print(pHead.value)

为了应对链表、栈、二叉树,还需要学习数据结构!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值