leetcode19-删除链表的倒数第N个节点

本文介绍了一种使用快慢指针一次性扫描的方法来解决链表中倒数第n个节点的删除问题,该方法避免了多次遍历,提高了效率。通过引入虚拟头结点简化边界情况处理,附带Java代码实现。

题目描述

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

示例

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

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

说明:给定的 n 保证是有效的。
你能尝试使用一趟扫描实现吗?

解题思路

1.快慢指针一次扫描法
要注意的是可能是要删除第一个节点

java代码如下:

public class Solution {
     private class ListNode {
         int val;
         ListNode next;
         ListNode(int x) { val = x; }
     }

     public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pre = new ListNode(Integer.MIN_VALUE);
        ListNode later = new ListNode(Integer.MIN_VALUE);
        pre.next = head;//引入虚拟头结点
        later.next = head;
         for (int i = 0; i < n; i++) {
             pre = pre.next;  //pre先行n步
             if(pre == null){    //说明链表节点个数不足n,就不存在倒数第n个节点
                 return null;
             }
         }
         //pre停在最后一个元素,later停在待删除节点的前一个节点
         while (pre.next != null){   //若改为pre==null,则pre停在最后一个元素的空位置,later会停在待删除元素
             pre = pre.next;//(这样满足pre先行一步,最后later停在倒数第一个;那么pre先行n步,later将停在倒数第n个)
             later = later.next;
         }
         ListNode relNode = later.next;
         if(relNode == head){    //如果需要删除的为头结点
             return head.next;    //head.next可能为空或者为第二个元素
         }
         later.next = relNode.next;
         relNode.next = null;
         return head;
    }
}

运行结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值