zoukankan      html  css  js  c++  java
  • LeetCode 19:删除链表的倒数第N个节点 Remove Nth Node From End of List

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

    Given a linked list, remove the n-th node from the end of list and return its head.

    示例:

    给定一个链表: 1->2->3->4->5, 和 n = 2.
    
    当删除了倒数第二个节点后,链表变为 1->2->3->5.
    

    说明:

    给定的 n 保证是有效的。

    Note:

    Given n will always be valid.

    进阶:

    你能尝试使用一趟扫描实现吗?

    Follow up:

    Could you do this in one pass?

    解题思路:

    这道题很有意思,虽然很简单,但是很考验一个人的思维。最先想到的方法就是遍历整个链表得到长度,减去 n 得到实际应该删除的节点的位置了。然而由于单链表删除操作的特殊性,得到位置之后仍然需要再遍历一次来删除该节点。

    进阶要求是一次遍历完成该题,想想是否有好的方法?

    假设链表长度为 L ,定义一个指针先走 n 步,此时该指针还剩下 L-n 个节点即可完成该链表的遍历。而第 L-n 个节点不就是题目要求的的要删除的倒数第 n 个节点吗?这时候只需要再定义一个指针,让它与之前的指针同时遍历,当第一个指针遇到空节点时(null 节点),该指针即指向删除的节点。

    值得注意的的是,指向应当删除的节点并无法删除它,应当指向该删除节点的前一个节点。

    Java:

    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode curA = head;
            ListNode curB = head;
            for (int i = 0; i < n; i++) curA = curA.next;
            if (curA == null) {//如果走了n步之后该节点指向空节点,则该链表只有一个节点
                head = head.next;
                return head;
            }
            while (curA.next != null) {//当第一个指针的下一个节点为空时,该指针指向最后一个节点,而指针curB 走了L-n-1步,即指向该删除节点的前一个节点
                curA = curA.next;
                curB = curB.next;
            }
            curB.next = curB.next.next;//将本来指向应当删除节点地址指向应当删除节点的下一个节点的地址
            return head;
        }
    }
    

    Python3:

    class Solution:
        def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
            curA,curB=head,head
            for i in range(n):
                curA=curA.next
            if not curA:
                head=head.next
                return head
            while(curA.next):
                curA=curA.next
                curB=curB.next
            curB.next=curB.next.next
    

    欢迎关注公.众号一起刷题:爱写Bug

    爱写Bug.png

  • 相关阅读:
    慈不掌兵,义不行贾,烂好人难成大业!
    克服焦虑
    静态路由汇总(路由聚合)
    OSPF协议介绍及配置 (下)
    OSPF协议介绍及配置 (上)
    我为什么鼓励工程师写blog
    佛弟子有三样东西需要永远保密
    【交换机在江湖】第十三章 VLAN划分篇
    FileZilla Server ftp 服务器下通过alias别名设置虚拟目录(多个分区)
    Java 对象和类
  • 原文地址:https://www.cnblogs.com/zhangzhe532/p/11231283.html
Copyright © 2011-2022 走看看