[路飞]_力扣算法题练习四:从尾到头打印链表、返回倒数第 k 个节点、环形链表

120 阅读1分钟

从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入: head = [1,3,2]
输出: [2,3,1]

限制:

0 <= 链表长度 <= 10000

  • 递归法
var reversePrint = function(head) {
    if(!head) return []
    var  valArr = [];
    function print(head){
        if(head.next){
            print(head.next)
        }
        valArr.push(head.val)
    }
    print(head)
    return valArr
};
  • 迭代法
var reversePrint = function(head) {
   if(!head) return []
   var valArr = []
   while(head){
       valArr.unshift(head.val)
       head = head.next
   }
   return valArr
};

返回倒数第 k 个节点

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

注意: 本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

给定的 k 保证是有效的。

  • 递归法
var kthToLast = function(head, k) {
    var index = 0;
    function print(head){
        // 有值就继续递归
        if(head.next){
            var res =  print(head.next)
            if(res!==undefined){
                return res
            }
        }else{
            index++
            if(k===1){
                return head.val
            }else {
                return 
            }
        }
        if(index>0){
            index++
            if(index===k){
                return head.val
            }
        }
    }
    return print(head)
};
  • 迭代法
var kthToLast = function(head, k) {
    if(!head) return []
    var valArr = []
    while(head){
        valArr.unshift(head.val)
        head = head.next
    }
    return valArr[k-1]
};

环形链表

给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

进阶:

你能用 O(1) (即,常量)内存解决此问题吗?

示例 1:

circularlinkedlist.png

输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。
  • 快慢指针
var hasCycle = function(head) {
    if(!head) return false
    var slow = head
    var fast = head.next
    while(fast && fast.next){
        slow = slow.next
        fast = fast.next.next
        if(slow===fast){
            return true
        }
    }
    return false
};
  • 利用数组中是否存在相同节点
var hasCycle = function(head) {
    if(!head) return false
    var arr = []
    while(head&&head.next){
        if(!!~arr.indexOf(head)){
            return true
        }
        arr.push(head)
        head = head.next
    }
    return false
};
``