LeetCode刷题之HOT100之删除链表的倒数第N个结点

晚上好。今天忙过去忙过来,也不知道都干了些啥,反正一天就这么过去了,时间过得飞快,五月的尾巴马上就要甩掉我了,我变得孤独。做完题回去看我的《百年孤独》啦,已经被它深深的吸引了。以前知道这本书非常出名,又因其为外文,语言结构上的差异以及人名的冗杂,让我没敢染指。现今陀思妥耶夫斯基的我都啃了好几本,再来看它就顺畅多啦。

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求删除倒数第N个节点。我的想法就是:看题解怎么说。链表问题:经典三板斧:哑节点、栈、双指针,学王道的数据结构时,成哑节点为哨兵。对于这个问题,个人最喜欢第一种方式,够直接,且性能不低。故我们就只来看第一种方式:哑节点。

算法流程:我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L− n + 1个节点时,它就是我们需要删除的节点。为了方便删除操作,我们可以从哑节点开始遍历 L − n + 1 个节点。当遍历到第 L − n + 1个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。

在这里插入图片描述

3、代码演示

public ListNode removeNthFromEnd(ListNode head, int n) {
        // 创建一个哑节点(dummy node),其next指向链表的头节点,方便处理头节点的删除
        ListNode ya = new ListNode(0,head);
        // 获取链表的长度 
        int length = getLength(head);
        // 初始化一个指针cur,指向哑节点
        ListNode cur = ya;
        // 移动cur指针到要删除节点的前一个节点
        // 因为是从末尾开始数,所以要移动cur到length - n的位置
        for(int i = 1; i < length - n + 1; i++){
            cur = cur.next;
        }
        // 跳过要删除的节点,即让cur.next指向要删除节点的下一个节点 
        cur.next = cur.next.next;
        // 返回处理后的链表的头节点(由于有哑节点,所以返回ya.next)
        ListNode res = ya.next;
        return res;
    }
    // 辅助方法:获取链表的长度 
    public int getLength(ListNode head){
        int length = 0;
        while(head != null){
            length++;
            head = head.next;
        }
        return length;
    }

画个图就非常直观了。时间复杂度:O(L),L为链表长度,空间复杂度:O(1)。

OK啦,时间不早啦,身体要紧哈哈,BYE,晚安啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值