合并两个有序单链表:
题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/
思路:比较两个链表的值,将值较小的加入到结果链表中
代码:
var mergeTwoLists = function(list1, list2) {
if(list1===null) {
return list2
}
if(list2===null) {
return list1
}
if(list1.val<list2.val) {
list1.next = mergeTwoLists(list1.next,list2)
return list1
}
else {
list2.next = mergeTwoLists(list1,list2.next)
return list2
}
};
环形链表
题目地址:https://leetcode-cn.com/problems/linked-list-cycle/
思路:通过快慢指针进行判断,快指针一次走两步,慢指针一次走一步,若链表中存在环,则两指针一定会有重合的时候
代码:
var hasCycle = function(head) {
let left = head
let right = head
while(right!=null&&right.next!=null) {
left = left.next
right = right.next.next
if(left==right) {
return true
}
}
return false
};
链表的中间节点
题目地址: https://leetcode-cn.com/problems/middle-of-the-linked-list/
思路: 通过快慢指针进行判断,指针运动方式 慢指针一次一步 快指针一次两步 这样当快指针到达尾部时,慢指针所在的位置就是链表的中点
代码
var middleNode = function(head) {
let slow = head
let fast = head
while(fast&&fast.next) {
fast = fast.next.next
slow = slow.next
}
return slow
};
删除单链表的倒数第k个元素
题目地址:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
思路: 也是通过快慢指针;要删除倒数第k个元素即要从前向后走 n-k 步 (n为链表长度) 让两指针相距k,当快指针走到最后时,慢指针的next即为倒数第k个元素
代码:
var removeNthFromEnd = function (head, n) {
var left = head
var right = head
while(n>0) {
right = right.next
n--
}
if(!right) return head.next
while(right&&right.next) {
left = left.next
right = right.next
}
left.next = left.next.next
return head
};
这些都是比较经典的单链表相关的问题,大部分题目都是使用双指针去解决的;在做题时一定要灵活运用双指针