6. 从尾到头打印链表
思路一:顺序遍历链表,给到list以后反转list
思路二:反转链表,正向输出。个人感觉速度快一点,两个算法同样遍历一次链表,而算法一需要额外的再做list的反转。(不过提交时间反而算法一快
代码一:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
array = []
while(head != None):
array.append(head.val)
head = head.next
return array[::-1]
代码二:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
pre, cur = None, head
while(cur != None):
nex = cur.next
cur.next = pre
pre = cur
cur = nex
array = []
while pre:
array.append(pre.val)
pre = pre.next
return array
7. 重建二叉树
思路:从头到尾遍历前序序列,前序每进行一步,就在中序序列中找到该值所对应的索引。根据中序的索引可以计算出该节点的左子树和右子树的元素个数,根据这个元素个数就可以对前序序列进行划分,分为左子树部分和右子树部分。最后递归建树即可。
代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if len(preorder) == 0:
return None
Tree = TreeNode(preorder[0])
loc = inorder.index(preorder[0]) #中序序列preorder[0]对应的索引
Tree.left = self.buildTree(preorder[1:1+loc], inorder[:loc]) #左子树loc个元素
Tree.right = self.buildTree(preorder[1+loc:], inorder[loc+1:]) #右子树从loc+1处到最后
return Tree
9. 用两个栈实现队列
思路:本题的思路我觉得就是用两个先进后出的容器,去模拟一个先进先出的容器。给定两个栈stack1和stack2,开始阶段如果加入数据,向stack1压栈,假设进行了5次appendTail的操作,此时stack1的size为5,Tail在栈顶。如果此时要进行deleteHead,需要把stack1所有的元素都倒入stack2,此时原来stack1的栈底元素变成了stack2的栈顶元素,而这个元素就是最早进入的,因此直接将stack2的栈顶弹出即可。如果还要进行deleteHead操作,继续将stack2的新栈顶弹出即可,直到stack2为空
所以在deleteHead会出现下面几种的情况:
- stack2非空,此时直接弹出stack2的栈顶即可;
- stack2为空,且stack1也为空,此时返回-1;
- stack2为空,而stack非空,此时将stack1倒入stack2中,弹出stack2的栈顶元素
代码:
class CQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
if len(self.stack2) != 0:
return self.stack2.pop()
elif len(self.stack1) == 0:
return -1
else:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()