24.两两交换链表节点
本题我是直接看的卡哥解析,搞懂了指针移动的顺序以及虚拟指针的定义这道题还是可以攻克的,重要的是多练
!
19.删除链表的倒数第N个节点
原题链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
代码随想录链接:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC
这道题刚开始用了暴力解法通过了一次,想尝试一下有技术型的解法,卡哥的攻略提示说能不能一次扫描实现,于是我想了很久始终想不到应该如何去解,怎么去根据n找出倒数第N个节点的位置,于是乎去看了卡哥的解析。
刚开始没有看完解析,当看到解析中说道让快指针先移动n位,然后快慢指针同时移动知道快指针到最后,当看到这里的时候我以为我懂了,于是自己按照这个思想去写完了代码,代码如下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode fastNode = dummyNode;
ListNode slowNode = dummyNode;
while(n-- > 0){
fastNode = fastNode.next;
}
while(fastNode.next != null) {
fastNode = fastNode.next;
slowNode = slowNode.next;
}
slowNode.next = fastNode;
return dummyNode.next;
}
}
我觉得可能有些人想法会和我一样,以为思想有了就可以随便写出来了,实际上现实狠狠地打脸了一波,测试结果当链表只有一个元素并且删除倒数第一个元素时运行出错,把测试用例代入到我的代码之后想了一通流程,发现上面的代码走下来果然会发生错误,这个时候虚拟头结点会指向第一个元素,最后返回的一样是原来的元素,然后我又发现了当数组元素为3个时,删除倒数第三个元素也会出错。
于是我又去把代码随想录的解析给看完了,发现我这个代码有两个主要错误。
- 第一个错误是快指针应该走n+1步,因为如果链表中只有一个元素并且删除倒数第一个节点,这个时候虚拟头结点可以指向空,也就相当于删除了该节点;
- 第二个错误是最后删除节点操作应该是
slowNode.next = slowNode.next.next
,而不是慢指针所指元素直接指向快指针,这一点反例可以参考链表元素有三个,删除倒数第三个节点;
改完错误后代码成功通过;
面试题02,07.链表相交
这道题因为我之前做过并且这次做的时候十分钟就ac了,所以就不多阐释了。