牛客网编程高频题19——NC53删除链表的倒数第n个节点

目录

删除链表的倒数第n个节点

描述

备注:

示例1

输入:

返回值:

方法一:暴力搜索

方法二:快慢指针


 

删除链表的倒数第n个节点

描述

给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针,例如,

给出的链表为:1→2→3→4→5,n=2

删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.


备注:

题目保证 n 一定是有效的,请给出请给出时间复杂度为O(n)的算法

链表数据结构为:

public class ListNode {
    int val;
    ListNode next = null;
}

示例1

输入:

{1,2},2

返回值:

{2}

 

方法一:暴力搜索

暴力破解,直接遍历到最后一个节点,统计链表的长度为L,然后再次重头遍历删除第L+1-n个节点

import java.util.*;

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode removeNthFromEnd (ListNode head, int n) {
        // write code here
        if(head.next==null) return null;
        
        int len=0;
        ListNode cur=head;
        while(cur!=null){
            cur=cur.next;
            len++;
        }

        if(len==n) return head.next;
        cur=new ListNode(0);
        cur.next=head;

        int i=0;
        while(i<len-n){
            cur=cur.next;
            i++;
        }
        cur.next=cur.next.next;
        return head;
    }
}

这种方法比较笨,时间复杂度较大,

 

方法二:快慢指针

思路是先定义两个指针都指向head,然后快指针先走n步,接着两个指针同时移动,快指针走到末尾时慢指针指向的节点就是要删除的节点

import java.util.*;
public class Solution {
    public ListNode removeNthFromEnd (ListNode head, int n) {
        // write code here
        if(head==null){
            return null;
        }
        ListNode fast=head;
        ListNode slow=head;
        for(int i=0;i<n;i++){
            fast=fast.next;
        }
        if(fast==null){
            return head.next;
        }
        while(fast.next!=null){
            fast=fast.next;
            slow=slow.next;
        }
        slow.next=slow.next.next;
        return head;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值