python--剑指offer--06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例

输入:head = [1,3,2]
输出:[2,3,1]

限制:
0 <= 链表长度 <= 10000

from typing import List


class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        """
        算法思想:
            (1) 总共遍历两遍。
            (2) 第一遍将旧链表进行逆序构造出一个新链表。
            (3) 第二遍将新链表遍历一遍,并存储遍历到的值。
            
        时间复杂度:
            O(n)
        
        空间复杂度:
            O(n)
            
        :param head: 链表头结点
        :return: 链表结点val值得逆序列表
        """
        if not head:  # 判断所给head是否是None
            return []  # 直接返回[]
        elif head.next is None:  # 判断所给链表是否只有一个结点
            return [head.val]  # 只有一个结点直接返回[head.val]
        else:
            # 所给链表有多个结点时
            new_head = None  # 新链表头结点
            temp = head  # 从旧链表中的头取一个结点
            old_head = head.next  # 更新旧链表的头结点
            while old_head:  # 直到旧链表头结点为None退出循环,此时需注意最后一个结点在循环中并没有加到新链表的头上,需退出循环后进行添加
                temp.next = new_head  # 将新链表的头结点变为temp的后继节点
                new_head = temp  # 更新新链表的头结点
                temp = old_head  # temp从旧链表的头上取一个新的结点
                old_head = old_head.next  # 更新旧链表的头结点
            # 循环退出需将旧链表最后一个结点放到新链表的头上
            temp.next = new_head  # 将新链表的头结点变为旧链表最后一个结点的后继节点
            new_head = temp  # 将旧链表的最后一个结点放在新链表的头上

            p = new_head  # p为当前结点
            result = []  # 保存新链表的结点val值
            while p:  # 遍历新链表
                result.append(p.val)
                p = p.next
            return result  # 返回新链表


if __name__ == '__main__':
    solution = Solution()
    node0 = ListNode(1)
    node1 = ListNode(3)
    node2 = ListNode(2)
    node0.next = node1
    node1.next = node2
    result = solution.reversePrint(node0)
    print(result)


"""
运行结果:
[2, 3, 1]

Process finished with exit code 0
"""

[题目来于Leetcode剑指offer]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值