力扣,删除链表中第N个节点

题目如下:
删除链表中第N个节点
这里提供两种思路,大同小异

  1. 思路一:统计链表长度,记录链表尾,根据总长和倒数N的位置计算删除节点之前的位置,删除返回
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 链表总长
        int len=0;
        // 链表尾巴
        ListNode tail=null;
        ListNode tem=head;
        while (tem!=null){
            len++;
            if(tem.next==null)
            	// 记录尾巴
                tail=tem;
            tem=tem.next;
        }
        if((len==1)&&n==1) return null;
        // 这里是要删除节点的前置节点位置
        int end=len-n;
        int index=1;
        ListNode te=head;
        if(end<index)
            return head.next;
        while (te!=null){
            if(index==end){
            	// 找到删除
                ListNode next = te.next.next;
                te.next=next;
                break;
            }
            index++;
            te=te.next;
        }
        return head;
    }
}
  1. 思路二:使用快慢指针寻找待删除节点的前置节点。先让快指针走N步,然后快慢指针一起走到结尾,则慢指针的位置就是前置节点。
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head!=null&&head.next==null&&n==1) return head.next;
        ListNode fast=head;
        ListNode slow=head;
        int fi=1;
        // 先走N步
        while (fi<=n){
            fast=fast.next;
            fi++;
        }
        if(fast==null)
            return head.next;
        while (true){
            fast=fast.next;
            if(fast==null)break;
            slow=slow.next;
        }
        // 找到前置,删除
        ListNode tem=slow.next.next;
        slow.next=tem;
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值