JZ6 从尾到头打印链表
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param listNode ListNode类
# @return int整型一维数组
#
class Solution:
def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
# 解法一:杰娃子提供方法,遍历,并将遍历到的val写在所有结果的最前面
result = []
while listNode:
result = [listNode.val] + result
listNode = listNode.next
return result
# 解法二:递归解法,但是python有递归深度限制
if listNode != None:
if listNode.next:
self.printListFromTailToHead(listNode.next)
result.extend([listNode.val])
return result
# 解法三:利用栈,后进先出
result = []
stack = []
while listNode:
stack.append(listNode.val)
listNode = listNode.next
while stack:
result.append(stack.pop())
return result
# 解法四:直接遍历,最后反转list即可
result = []
while listNode:
result.append(listNode.val)
listNode = listNode.next
return result[::-1]
反转链表
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
class Solution:
def ReverseList(self , head: ListNode) -> ListNode:
# write code here
# 普通方法,取出链表中每个值放到list,然后将list反转,最后根据反转后的list重新构建链表,注意最后一个元素的next需要置为None
if not head: return head
result = []
while head:
result.append(head)
head = head.next
result = result[::-1]
for i in range(len(result)-1):
result[i].next = result[i+1]
result[-1].next = None
return result[0]
# 双链表法,先把当前值后面所有保存在temp中,然后把当前值后面的都换成result,也就是取出一个值就放在result的前面,然后
# 更新result为目前链表中所有,之后在从temp中读出进行下一步操作
result = None
while head:
temp = head.next #temp = 2,3,None temp = 3,None
head.next = result #head.next = None head.next = 1,None
result = head #result = 1,None result = 2,1,None
head = temp #head = 2,3,None head = 3,None
return result