从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 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:
输入: 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
};
``