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