29、链表-删除链表的倒数第N个结点

思路:

首先找到倒数第N个结点

  1. 第一种方式 先统计链表的节点数,然后再次遍历len-N即可得到倒数第N个结点,然后将前一个节点的next指针指向next的下一个节点
  2. 使用快慢指针,快指针先跑N个结点然后慢指针开始跑,等快指针到达尾节点后,慢指针的位置就是倒数第N个结点位置

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    //集合方式 简单粗暴
    public ListNode removeNthFromEnd01(ListNode head, int n) {
        if (head == null) {
            return head;
        }
        List<ListNode> list = new ArrayList<>();
        while (head!=null){
            list.add(head);
            head=head.next;
        }
        list.remove(list.size()-n);
        if (list.isEmpty()){
            return null;
        }
        ListNode node=list.get(0);
        ListNode cur=node;
        for (int i = 1; i < list.size(); i++) {
            cur.next=list.get(i);
            cur=cur.next;
        }
        cur.next=null;
        return node;
    }
    //计数方式 删除倒数第n个 先算出 链表长度
    public static ListNode removeNthFromEnd02(ListNode head, int n) {
        if (head==null){
            return null;
        }
        int len=0;
        ListNode node=head;
        while (node!=null){
            len++;
            node=node.next;
        }
        if (n>len){
            return head;
        }
        if (n==len){
            return head.next;
        }
        //倒数第N个 就是整数len-n个
        ListNode cur=head;
        int index=0;
        while (cur!=null){
            //走到前一个节点时
            if (index==len-n-1){
                cur.next=cur.next.next;
                break;
            }
            cur=cur.next;
            index++;
        }

        return head;
    }
    //使用快慢指针  快指针先走n个节点  慢指针再开始走 当快指针到达null节点时候 慢指针正好到达倒数第n个节点
    //并且添加哑节点 来简化边界条件 防止如果删除的头节点问题
    public static ListNode removeNthFromEnd(ListNode head, int n) {
        if (head==null){
            return null;
        }
        ListNode dummy  = new ListNode(0, head);
        ListNode fast=dummy ;
        ListNode slow=dummy;
        for (int i = 0; i <= n; i++) {
            fast=fast.next;
        }
        while (fast!=null){
            slow=slow.next;
            fast=fast.next;
        }
        slow.next=slow.next.next;
        return dummy.next;
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值