此阶段给自己定的目标是:做过的这些题每天坚持继续刷二遍,每道题做过之后开始尝试多解法尝试解题。上一阶段是感知都有什么题目,此阶段主要系统化常规题解套路知识,牢记牢记此阶段目的。
题号:剑指 Offer 24
//递归
var reverseList = function (head) {
//很多时候设置一个哑节点有利于简化处理逻辑
let dummy = null
let helper = (node) => {
if (node == null) {
dummy = new ListNode(-1)
return dummy
}
let preNode = helper(node.next)
preNode.next = node
node.next = null
return node
}
helper(head)
return dummy.next
};
题号:剑指 Offer 18
var deleteNode = function (head, val) {
let dummy = new ListNode(-1)
dummy.next = head
let preNode = dummy, curNode = head
while (curNode) {
if (curNode.val == val) {
//开始删除
preNode.next = curNode.next
break
} else {
preNode = preNode.next
curNode = curNode.next
}
}
return dummy.next
};
题号:剑指 Offer 06
//递归
var reversePrint = function (head) {
let result = []
let helper = (node) => {
if (node == null) {
return
}
helper(node.next)
result.push(node.val)
}
helper(head)
return result
};
//栈迭代
var reversePrint = function (head) {
let stack = []
while (head) {
stack.unshift(head.val)
head = head.next
}
return stack
};
题号:剑指 Offer 52
//借助map,set之类的集合容器
var getIntersectionNode = function (headA, headB) {
let set = new Set()
while (headA) {
set.add(headA)
headA = headA.next
}
while (headB) {
if (set.has(headB)) {
return headB
}
headB = headB.next
}
return null
};
//一开始没想到此种解法
//数学知识了
var getIntersectionNode = function (headA, headB) {
let l1 = headA, l2 = headB
while (l1 != l2) {
if (l1 == null) {
l1 = headB
} else {
l1 = l1.next
}
if (l2 == null) {
l2 = headA
} else {
l2 = l2.next
}
}
return l1
};
题号:剑指 Offer 35
var copyRandomList = function (head) {
let map = new Map(), curNode = head
//遍历原始列表创建对应的副本节点并一一对应
while (curNode) {
let newNode = new Node(curNode.val, null, null)
map.set(curNode, newNode)
curNode = curNode.next
}
//开始组装结果链表
//把上一步创建的副本串起来
let dummy = new Node(-1, null, null)
curNode = dummy
while (head) {
curNode.next = map.get(head)
curNode.next.random = map.get(head.random)
curNode = curNode.next
head = head.next
}
return dummy.next
};