栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

T19删除链表的倒数第N个节点——Java实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

T19删除链表的倒数第N个节点——Java实现

T19题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

解题过程 解法一 思路
  • 常规方法…
  • 先计算,是正数第size-n个
  • 设置一个变量,标记节点走一步就+1,直到定位到目标节点为止
解法二 思路
  • 使用快慢双指针firstNode以及lastNode

  • 开始时,firstNode指针指向head,而lastNode指针需要先指向一个哑节点,定位到目标节点的前驱节点,便于删除节点

  • 哑节点:ListNode dummyNode = new ListNode(0,head);这样哑节点的下一个节点就是头节点了

实现代码
public ListNode removeNthFromEnd(ListNode head, int n) {
        //使用快慢指针
        //设first指针先走n步,当它刚走n步的时候,last指针就开始跟着first指针一起走

        ListNode firstNode = head;
        ListNode dummyNode = new ListNode(0,head);
    	ListNode lastNode = dummyNode;
        int count = 0;
    //这里会有点绕,关于什么时候lastNode开始移动,官方解答在一个循环里让firstNode先走,很容易懂
        while(firstNode.next != null){
            firstNode = firstNode.next;
            count++;
            if(count>=n){
                lastNode = lastNode.next;
            }
        }
    //我这里还考虑了是否删除的是原头节点,与官方解答比起来,就很多余
    //没有考虑到dummyNode节点的下一个节点就是新的头节点
        if (lastNode.next == head){
            return head.next;
        }

        lastNode.next = lastNode.next.next;
        return head;
    }
官方解答(更加清晰易懂,向他们学习!)
 public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        ListNode first = head;
        ListNode second = dummy;
        for (int i = 0; i < n; ++i) {
            first = first.next;
        }
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
     //直接返回哑节点的下一个节点了,不管删除的是不是原先的头节点
        ListNode ans = dummy.next;
        return ans;
    }

解题收获 疑惑点
  • 如果删除的是头节点怎么办,使用双指针的时候我要怎么定位它,以及怎么删除它,没有想到可以设置一个哑节点
  • 使用while循环让firstNode先走,在判断lastNode什么时候走的时候脑袋有点混乱
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666999.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号