最近在刷 「剑指 Offer」
第二天的题,把自己的小心得放在这里做记录
第一题
- 注意点1:
for _ in range(len(tmp)):
res.append(tmp.pop())
return res
和
return tmp[::-1]
效果一样。
栈和列表的关系:
列表如何实现栈?
push–append
弹出–pop
先进后出–tmp[::-1]
或 res.append(tmp.pop()
- 注意点2:
想要遍历链表,需要循环
while head:
tmp.append(head.val)
head = head.next
终止条件是本身,append,和循环条件(循环体)
第二题
很绕!!!
NULL -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
利用图解来做
- 第一步
pre, cur = None, head
把head头节点给cur
- 第二步
while cur:
直到遍历完,使得cur停留在最右边的NULL上,记得返回值是pre
- 第三步
tmp = cur.next
防止断开,先保存当前节点的下一个节点
- 第四步
cur.next = pre
改变当前节点的指向,本来是指向后面的节点的,现在指向前一个节点
第一次箭头指向的转换已完成
- 第五步
pre = cur
cur = tmp
考虑下一轮的pre和cur的位置
- 第六步
return pre
循环结束, 返回cur当前节点的前一个节点pre
因为当前节点指向的是最右边的NULL,此时的头节点(原来的尾节点)是pre。
第三题
下午再做,先去吃饭了
太太太难了
考了链表的删除,加入
分三步
第一步:val 把值复制下来并且插入在当前值的后面
第二步:random 把随机指针放进去
第三步:拆分
再考虑一下特殊情况,head为空即可。
# 1
cur = head
while cur:
curCopy = Node(cur.val)
curCopy.next = cur.next
cur.next = curCopy
cur = curCopy.next
# 2 random
cur = head
while cur:
if cur.random:
cur.next.random = cur.random.next
cur = cur.next.next
# 3
cur = head
Newhead = head.next
while cur.next:
tmp = cur.next
cur.next = tmp.next
cur = tmp
return Newhead