【算法】删除单链表的倒数第N个结点

本文介绍了一种高效的方法来删除单链表中的倒数第N个节点,通过使用两个指针实现一次遍历即可完成操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Given a linked list, remove the nth node from the end of list and return its head.
 *For example,
 *  Given linked list: 1->2->3->4->5, and n = 2.
 *  After removing the second node from the end, 
 *  the linked list becomes 1->2->3->5.
 *Note:
 *  Given n will always be valid.
 *  Try to do this in one pass.

这是Leetcode中的一道题,剑指offer中是查找到单链表的倒数第N个结点,题目类似。

解题思路

采用两个指针,first和slow,first先后移N个结点,然后slow和first同时向后移动,因为两个指针相差N个结点,所以当first.next==null,slow现在指的就是倒数第N个结点的前驱,所以直接利用slow.next = slow.next.next,删除这个节点。
代码如下:

/**
 * @ congrisheng
 * @ 2017-3-13
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public ListNode removeNthFromEnd(ListNode head, int n){
    if(head == null || head.next == null){
        return null;
    }

    ListNode slow  = head;
    ListNode first = head; 

    for(int i = 0; i < n; i++){
        first = first.next;
    }
    if(fast == null){
        head = head.next;
        return head;
    }
    while(first.next != null){
        slow  = slow.next;
        first = first.next;
    }
    slow.next = slow.next.next;
    return slow;
}

From《剑指offer》Page13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值