LeetCode刷题—链表—19删除链表的倒数第 N 个结点(双指针经典应用)

文章介绍了如何使用双指针方法解决链表删除倒数第N个节点的问题,强调了在快指针先走n+1步的细节处理,避免因n过大导致的空指针异常,并给出了Java代码示例。
摘要由CSDN通过智能技术生成
  • 题目描述:

5c4ef643268442a081852e9954d753f7.png

  • 题目剖析:

整体思路:

双指针方法,快指针提前走n+1步,之后快慢指针同时移动,直到快指针为空,slow指向的节点便是待删除节点的前一个节点

走n步的细节处理:

尽量不要用先走n步,之后再走一步,因为如果题目中没有规定1 <= n <= size的话,输入的n值大于size,fast为null,再执行fast = fast.next; 会出现空指针异常

注意循环条件:

先移动快指针:n > 0 && fast != null   

快慢指针同时移动:fast != null 

  • Java代码:
public class Solution19 {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;
        ListNode fast = dummyHead;
        ListNode slow = dummyHead;
        // 这里是fast先走n+1步,为啥选择先让n++,然后fast后移
        // 而不是:先走n步,然后fast再后移呢
        // 因为如果题目中没有规定1 <= n <= size的话,输入的n值大于size,fast为null,
        // 再执行fast = fast.next; 会出现空指针异常
//        while (n > 0 && fast != null) {
//            fast = fast.next;
//        }
//        fast = fast.next;
        n++;
        while (n > 0 && fast != null) {
            fast = fast.next;
            n--;
        }
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummyHead.next;
    }
}
class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值