输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 :
输入: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]