leetcode之删除链表的倒数第N个节点

本文介绍了一种高效的算法来解决链表中删除倒数第N个节点的问题,通过一趟扫描实现,避免了多次遍历。文章详细解释了如何利用两个指针之间的距离来定位待删除节点,最终完成任务。

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

使用一趟扫描实现

思路:定义一个tail尾结点,定义一个pre结点,两者相隔为n,当尾结点到达第n个结点以后,pre结点开始随尾结点向后移动,直到尾结点到达尾部,pre结点到达倒数第n个结*点。本题依据这个思路做细微调整

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
/*
*思路:定义一个tail尾结点,定义一个pre结点,两者相隔为n,当尾结点到达第n个结点以后,pre结点开始随尾结点向后移动,直到尾结点到达尾部,pre结点到达倒数第n个结*点。本题依据这个思路做细微调整
*/

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //用于指向链表头部,最后返回结果
        ListNode ret=head;
        ListNode pre=head;

        //定义了一个带头结点的链表(即第一个结点不存储数据,仅用来指向下一结点)
        ListNode tail=new ListNode(0);
        tail.next=head;


        int i=0;

        while(tail.next!=null)
        {
            ++i;
            tail=tail.next;

            if(i>n+1)
            {
                pre=pre.next;
            }
        }
        //当n==i时,说明删除的是第一个结点,则直接返回后续结点即可
        if(n==i)
        {
            return ret.next;
        }
        pre.next=pre.next.next;

        return ret;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值