给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
Given a ed 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
继续阅读与本文标签相同的文章
上一篇 :
手机一对一直播源码APP平台搭建解决方案
下一篇 :
阿里云服务器是什么/阿里云服务器是干嘛用的
-
【直播回顾】 手把手教你玩转阿里云推广技术变现之路!(1)如何加入推广计划 及推广网站建立
2026-05-23栏目: 教程
-
什么是网站结构?网站结构优化的内容和方法
2026-05-23栏目: 教程
-
吐血整理所有常见端口,不全你来打我!
2026-05-23栏目: 教程
-
物流快递查询API接口怎么对接(中通、申通、韵达/顺丰、韵达)
2026-05-23栏目: 教程
-
Apache Flink中的广播状态实用指南
2026-05-23栏目: 教程
