Day04:打卡链表part02

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了,所以就不多阐释了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值