LeetCode进阶之路(Remove Nth Node From End of List)

本文介绍了一种高效算法,用于删除单链表中倒数第N个节点,仅通过一次遍历实现。具体步骤包括设置两个指针P和Q,先让P指针前进N步,随后P和Q指针同步移动直至P到达链表尾部,此时Q指针所指向的即为目标节点。

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

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.

题目:删除链表倒数第N个节点。

思路:准备两个指针P、Q,先让P走N个,然后在一起走,知道P走完,此时Q到达的点就是需要删除的点。

public static ListNode removeNthFromEnd(ListNode head, int n) {  
        if(n == 0 || head == null){  
            return head;  
        }  
        if(n == 1 && head.next==null){  
            return null;  
        }  
           
        ListNode p = head, q = head;  
        // 让p先行q n个位置  
        for(int i=0; i<n; i++){  
            if(p != null){  
                p = p.next;  
            }else{  
                return head;  
            }  
        }  
           
        // 如果这个时候p已经是null,则说明删除的必定为head  
        if(p == null){  
            head = head.next;  
            return head;  
        }  
           
        // p和q一起前进  
        while(p.next != null){  
            q = q.next;  
            p = p.next;  
        }  
        // 删除元素  
        q.next = q.next.next;  
        return head;  
    }  

种一棵树最好的时间是十年前,其次是现在!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值