剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
迭代
def reversePrint(self, head: ListNode):
cur = head
li = []
while cur:
li.append(cur.val)
cur = cur.next
li.reverse()
return li
递归:
def reversePrint(self, head, li=[]):
if head:
return self.reversePrint(head.next) + [head.val]
return []
剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
迭代
def reverseList(self, head: ListNode) -> ListNode:
if not head:
return None
cur = head
pre = None
while cur.next:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
cur.next = pre
return cur
画图很重要,一步步走,注意鲁棒性
递归
def reverseList(self, head: ListNode) -> ListNode:
if head is None or head.next is None:
return head
ret = self.reverseList(head.next)
head.next.next = head
head.next = None
return ret
递归3要素:
- 终止条件:return 什么
- 进入下一层 :调用自身,修改参数
- 过程逻辑:当前层操作
剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
哈希表
def copyRandomList(self, head: 'Node') -> 'Node':
if not head: return
dic = {}
cur = head
while cur:
dic[cur] = Node(cur.val)
cur = cur.next
cur = head
while cur:
dic[cur].next = dic.get(cur.next)
dic[cur].random = dic.get(cur.random)
cur = cur.next
return dic[head]
参考了答案。