题解 | #删除链表的倒数第n个节点#

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

http://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6

前置知识

需要先了解找倒数第k个结点的方法
这里附上“BM8-链表中倒数最后k个结点”的题解:附图解

思路 (以下用k代表n)

  • 找到倒数第k+1个结点:now
  • 将倒数第k+1个结点指向倒数第k-1个结点,即now.next=now.next.next
  • 将倒数第k个结点赋值为null

边界条件讨论

  • 如果k=链表长度,则为删除第一个结点,倒数第k+1个结点为null,则返回倒数第k-1个结点
  • 如果k大于链表长度(不可能出现,题目保证n有效)
  • 如果k=1,则删除最后一个结点,此种边界情况可归并到普通思路中。

符号说明

  • now用于遍历链表(迭代器)
  • last用于记录now的上一个结点
  • box用于记录倒数k+1个结点
public ListNode removeNthFromEnd (ListNode head, int n) {
        if(head==null) return null;
        ListNode now=head;
        ListNode[] box=new ListNode[n+1];
        int i=0;
        //维护box,跳出循环时box[i]为倒数第k+1个结点
        while(now!=null){
            box[i]=now;
            if(i==n) i=0;
            else i++;
            now=now.next;
        }
        //如果k=链表长度,则倒数第k个结点为第一个结点,倒数第k+1个结点不存在,即为null
        if(box[i]==null){
            return head.next;
        }
        //如果k=1,倒数第k+1个结点为box[i],倒数第k个结点为box[0]
        if(i==n){
            box[i].next=box[0].next;
            box[0]=null;
        }
        //k小于链表长度
        else{
            box[i].next=box[i+1].next;
            box[i+1]=null;  
        }
        return head;
    }
全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹 是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹 待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹 能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥 内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务