我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第一篇文章,点击查看活动详情
24.两两交换链表中的节点
解决
这道题需要改变的指向就很多了,完全是用脑袋想不明白的地步。所以需要动手画图。
画完图后逻辑就很清晰了,首先判断什么时候遍历停止(也就是不需要交换了)。
当后面没有两个节点,自然就不需要交换了——temp.next && temp.next.next
var swapPairs = function(head) {
let ret = new ListNode(0,head),temp = ret
while(temp.next && temp.next.next) {
let pre = temp.next,cur = temp.next.next
pre.next = cur.next
cur.next = pre
temp.next = cur
temp = pre
}
return ret.next
};
这里还需要注意的一点是temp一次交换后移动的位置temp = pre
19.删除链表的倒数第N个节点
自己看到题目的第一想法
第一想法是通过两次遍历的方式实现。首先遍历一次得到链表的长度,之后当遍历到第 L-n+1L−n+1 个节点时,就是要删除的节点。
看完代码随想录之后的想法
通过快慢指针的方式,快指针走n步后快慢指针一起走,这样,快指针指向结尾的时候慢指针正好是倒数n个元素。这种方式真的很巧妙。通过一次循环的方式就解决了问题。
代码如下:
var removeNthFromEnd = function(head, n) {
let ret = new ListNode(0,head)
let slow = fast = ret
while(n--) fast = fast.next
while(fast.next != null) {
fast = fast.next
slow = slow.next
}
slow.next = slow.next.next
return ret.next
};
面试题 02.07. 链表相交
看完代码随想录之后的想法
这道题首先要计算两个链表的长度,再计算两个链表的差值。定义两个指针分别指向两个链表的头节点。让长的那个链表先走链表的差值步,这样可以让两个链表的尾部对齐。这样只需要让两个指针同时向后走当指针相同的时候就证明两个链表有交点了。
自己实现过程中遇到哪些困难
看完题解后一直在困惑为什么curA === curB就证明链表相交了,因为我觉得后面也可能有不一样的元素,后来看到指针相同恍然大悟。原来是判断指针相同,这样指向的后面的链表一定是相同的。
142. 环形链表 II
看完代码随想录之后的想法
解这道题有种解数学题的感觉hhhhh。首先定义两个指针,慢指针一次移动一步,快指针一次移动两步。这样如果链表有环快慢指针就会在环中相遇。这样就可以判断链表是否有环了。
但是题目要求返回来链表开始入环的第一个节点,这里需要一些数学操作(宇宙的尽头果然是数学)
推理过程:
代码如下;
var detectCycle = function(head) {
if(!head || !head.next) return null
let slow = head.next,fast = head.next.next
while(fast && fast.next) {
slow = slow.next
fast = fast.next.next
if(fast === slow) {
slow = head
while(fast !== slow) {
slow = slow.next
fast = fast.next
}
return slow
}
}
return null
};
自己实现过程中遇到哪些困难
这道题困难的不是代码的实现,而是解决问题的方法。如果没有题解,我可能很久都不会想到解题办法。只能多多刷题,形成解题思维。