leetCode 链表面试题

83 阅读1分钟

「这是我参与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
};