删除链表的倒数第N个节点 (Java)

本文介绍了一种仅需一次遍历的高效算法,用于删除链表中倒数第N个节点。通过双指针技巧,预指针和索引指针的巧妙配合,实现了简洁而优雅的解决方案。

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

 

思路很简单,采用双指针pre 和index,开始时两个都指向头部。删除倒数第几个就让index指针先走几步。

然后两个指针同步下移,index的next为空时结束遍历,pre指向的节点就是需要删除的。

因为pre指向尾节点的情况下不会删除pre指向的节点,所以又加了第三个指针,pre的前指针。

总的来说这个题目还是偏简单,就是具体实现的时候删除指定节点遇到了点问题,做个记录。

 

public ListNode removeNthFromEnd(ListNode head, int n) {
    if (null == head) {
        return null;
    }
    if (n <= 0) {
        return head;
    }

    ListNode exPre = head;
    ListNode pre = head;
    ListNode index = head;

    for (int i = 1; i < n; i++) {
        index = index.next;
        if (null == index) {
            return head;
        }
    }

    while (index.next != null) {
        exPre = pre;
        pre = pre.next;
        index = index.next;
    }

    //pre指向的节点为要删除的节点
    //删除的时候分了两种情况,一种是要删除的节点有后继节点
    if(null != pre.next){
        pre.val = pre.next.val;
        pre.next = pre.next.next;
    }else {
        //要删除的节点没有后继节点。这里又有一个特殊情况就是链表只有一个节点
        if(exPre.next == null){
            return null;
        }
        exPre.next = null;
    }

    return head;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值