ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

删除链表倒数第n个节点(JAVA)

2021-01-23 22:02:20  阅读:134  来源: 互联网

标签:JAVA 删除 next 链表 second 指针 倒数第 first


题目描述
给定一个链表,删除链表的倒数第n个节点并返回链表的头指针
例如,

给出的链表为:1->2->3->4->5, n= 2.
删除了链表的倒数第n个节点之后,链表变为1->2->3->5.

备注:
题目保证n一定是有效的
请给出请给出时间复杂度为 O(n)的算法

示例1
输入

{1,2},2

返回值

{2}

public class Test {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode first = head;
        ListNode second = head;
        for (int i = 0; i < n; i++)
            first = first.next;
        //如果n的值等于链表的长度,直接返回去掉头结点的链表
        if (first == null)
            return head.next;
        while (first.next != null)   //同时移动两个指针直到第一个指针指到尾
        {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        return head;
    }

    public class ListNode {
        int val;
        ListNode next = null;
    }
}

图解:
第一步: 定义快慢指针都等于Head
在这里插入图片描述
第二步:让快指针走n步假设n等于2

在这里插入图片描述
第三步:两个指针一块走,直到快指针走到尾
1)循环1次
在这里插入图片描述
2)循环2次
在这里插入图片描述
跳出循环此时我们发现要删除的元素是4,我们的第二个指针正好指向要删除元素的上一个,我们知道链表删除元素很简单直接让删除元素的上一个元素的指针指向要删除元素的指向的下一个元素所以

最后一步:
在这里插入图片描述
可能有些小伙伴看了这个图解有疑问:
second.next = second.next.next; 最后一步是不是也可以这样写:second.next = first;
这样写就错了

为什么呢?因为我在上边举例是要删除的倒数第二个 那么我们删除第三个的话我们看一下最后怎么定位的呢?
在这里插入图片描述
看了这个大家就知道为什么这样写了吧!

标签:JAVA,删除,next,链表,second,指针,倒数第,first
来源: https://blog.csdn.net/weixin_45498245/article/details/113062726

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有