算法思想一:双指针    解题思路    由于我们需要找到倒数第 n 个节点,因此可以使用两个指针fast 和 slow 同时对链表进行遍历,并且 fast 比 slow 超前 n 个节点。当 fast 遍历到链表的末尾时,slow 就恰好处于倒数第 n 个节点。 具体地,初始时 fast 和 slow 均指向头节点。首先使用 fast 对链表进行遍历,遍历的次数为 n。此时,fast 和 slow 之间间隔了 n-1 个节点,即 fast 比 slow 超前了 n 个节点。 在这之后,同时使用 fast 和 slow 对链表进行遍历。当 fast 遍历到链表的末尾(即 fast 为空指针)时,slow 恰好指向倒数第 n 个节点。   图解:      代码展示:    Python版本  class Solution:    def removeNthFromEnd(self , head , n ):        # write code here        if not head:            return None        # 定义快慢指针        slow = head        fast = head        for i in range(n):            fast = fast.next        # 判断n是否大于head的长度        if not fast:            return head.next        # 快慢指针同时行走        while fast.next:            fast = fast.next            slow = slow.next        # 删除结点        slow.next = slow.next.next        return head     复杂度分析     时间复杂度O(N):N表示链表的长度,遍历整个链表    空间复杂度O(1):双指针占用空间          算法思想二:计算链表长度       解题思路   首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后再从头节点开始对链表进行一次遍历,当遍历到第 L-n+1 个节点时,它就是我们需要删除的节点 为了方便删除操作,可以从哑节点开始遍历 L-n+1 个节点。当遍历到第 L-n+1 个节点时,它的下一个节点就是需要删除的节点,这样只需要修改一次指针,就能完成删除操作   图解:      代码展示:    JAVA版本  import java.util.*;/* * public class ListNode { *   int val; *   ListNode next = null; * } */public class Solution {    /**     *      * @param head ListNode类      * @param n int整型      * @return ListNode类     */    public ListNode removeNthFromEnd (ListNode head, int n) {        // write code here        int length = 0;        ListNode p = head;        ListNode q = head;        // 获取链表的长度        while(head != null){            length++;            head = head.next;        }        if(length < 2){            return null;        }        // 特殊情况        if(n == length){            return q.next;        }        int i = 0;        while(p != null){            i++;            if(i == length - n){                // 删除结点                p.next = p.next.next;            }            p = p.next;        }        return q;    }}         复杂度分析          时间复杂度O(N):N表示链表的长度,遍历整个链表       空间复杂度O(1):常数级空间  
点赞 28
评论 2
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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