图解LeetCode19:删除链表的倒数第 N 个结点

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

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
在这里插入图片描述

一、题目解析

这就是一个简单地数据结构问题,关于链表地问题,就是删除链表地指定节点。唯一区别就是题目中给定的是将其倒数的位置节点删除

1、删除链表指定节点

所以问题就转变为了删除链表的指定节点,链表的指定节点删除只需要把3.next=4.next即可,就把3的下一个节点指向5
在这里插入图片描述

public void deleteNode(ListNode list, int value){
    int result = 0;
    ListNode node = list;
    while(result <= value){
        node = node.next;
        if(result == value){
            node.next = node.next.next;
            break;
        }
        result++;
    }
}
2、计算链表长度

解决了删除第n个点的问题,就可以解决求得链表长度,然后计算出想要删除的第n个点

求解链表长度可以选择遍历链表,直到节点的next为null,终止返回长度,如下图所示
在这里插入图片描述

public int getLength(ListNode head) {
    int length = 0;
    while (head != null) {
        ++length;
        head = head.next;
    }
    return length;
}

二、解题

将两者组合在一起,求得要删除的节点,然后将节点删除即可

public ListNode removeNode(ListNode head, int n) {
    ListNode ptr = new ListNode(0, head);
    int length = getLength(head);
    ListNode cur = ptr;
    for (int i = 1; i < length - n + 1; ++i) {
        cur = cur.next;
    }
    cur.next = cur.next.next;
    ListNode ans = ptr.next;
    return ans;
}

public int getLength(ListNode head) {
    int length = 0;
    while (head != null) {
        ++length;
        head = head.next;
    }
    return length;
}

三、测试代码

public void test(){
    LeetCode19 lt = new LeetCode19();
    ListNode head = lt.createNode(new int[]{1, 2, 3, 4, 5});
    seeNode(head);
    lt.removeNode(head, 2);
    seeNode(head);
}

结果:

12345
1235
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值