「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
废话少说,我们来看题
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入: head = [1,3,2]
输出: [2,3,1]
思路: 这里用到的是翻转链表的思想 然后把每次截取到的链表unshift到数组中
var reversePrint = function(head) {
let arr = []
let cur = head
let pre = null
let temp
while(cur){
temp = cur.next // 用一个中间值来接受链表的next
cur.next = pre // 把链表的next置于null
arr.unshift(cur.val) //把链表的值unshift到数组中
cur = temp
}
return arr
};
// 这是我第一次想到的方法,但是细看下就会发现我想的太过于复杂了,我完全没必要翻转链表呀
var reversePrint = function(head) {
let arr = []
let cur = head
while(cur){
arr.unshift(cur.val)
cur = cur.next
}
return arr
};
面试题 02.02. 返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
思路也是翻转链表,之后循环K次,拿到第K个节点代表的值
var kthToLast = function (head, k) {
var arr = reversePrint(head)
var a
for (i = 1; i <= k; i++) {
a = arr.val
arr = arr.next
}
return a
};
// 翻转链表
var reversePrint = function (head) {
let cur = head
let pre = null
let temp
while (cur) {
temp = cur.next
cur.next = pre
pre = cur
cur = temp
}
return pre
};