LeetCode 19:删除链表的倒数第 N 个结点

链接

题目:
在这里插入图片描述

方法一:快慢指针

  1. 如果要删除倒数第n个节点,让fast移动n步,目的是拉开fast和slow之间的距离;
  2. 然后让fast和slow同时移动,直到fast指向链表末尾,此时slow就是要删除的节点!
  3. 最后fast为末尾节点的next即为null,slow就是要删除的节点node,而pre节点记录了node的前节点!

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(n<=0){
            return head;
        }
        // 哨兵节点!
        ListNode mer=new ListNode(-1);
        mer.next=head;
        
        ListNode fast=mer;
        ListNode slow=mer;
        //fast移动n次
        for(int i=0;i<n;i++){
            fast=fast.next;
        }
        ListNode pre=null;
        while(fast!=null){
            pre=slow;
            // slow和fast一起移动,直到fast到末尾
            slow=slow.next;
            fast=fast.next;
        }
        // 删除
        pre.next=slow.next;
        return mer.next;

    }
}

方法二:模拟

直接按情况分类计算;
排除k>size和k=size=1的特殊情况;
如果k=1且size>1,即删除最后一个节点;
如果k>1且k=size,即删除第一个,那么直接返回第二个节点即可;
而k>1且k<size时,将前驱节点指向要删除节点的next即完成删除;


class Solution {
    public ListNode removeNthFromEnd(ListNode head, int k) {
        Stack<ListNode> s=new Stack<>();
        ListNode curr=head;
        while(curr!=null){
            s.push(curr);
            curr=curr.next;
        }
        // base case
        if(k>s.size() || k<=0){
            return head;
        }
        if(k==1 && s.size()==1){
            return null;
        }

		else if(k==1 && s.size()>1 ){
            s.pop();
            ListNode pre=s.pop();
            pre.next=null;

        }else if(k>1 && k==s.size()){
            ListNode second=null;
            for(int i=0;i<k-1;i++){
                second=s.pop();
            }
            return second;
        }else if(k>1 && k<s.size()){
            ListNode front=null;
            for(int i=0;i<k+1;i++){
                front=s.pop(); // 前
            }
            front.next=front.next.next;
        }

        return head;


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值