一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
一、题目描述:
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:
输入:head = [1], n = 1 输出:[] 示例 3:
输入:head = [1,2], n = 1 输出:[1]
提示:
链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz
进阶:能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/SL…
二、思路分析:
删除链表的倒数第n个节点,首先想到是首先从头节点开始对链表进行一次遍历,得到链表的长度 。随后再从头节点开始对链表进行一次遍历,当遍历到第 L-n+1 个节点时,它就是我们需要删除的节点。但是进阶要求一趟扫描实现,那么可以利用快慢指针,只用一次遍历。 具体做法 增加虚拟节点,并把虚拟节点指向head(之所以要增加虚拟头节点是为了要简化代码当中的非空判定,这是链表题目的通用套路) 让快指针向前先走n步 快慢指针同步齐步向前走直至快指针走到了链表末尾 这时慢指针的next刚好指向刚好指向倒数第n个结点,将它的next的指向next.next即达到了删除的效果 返回虚拟节点的next也就是head
三、AC 代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode fast = head;
ListNode slow = dummyHead;
while(n-- > 0) {
fast = fast.next;
}
while(fast != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummyHead.next;
}
}
四、总结:
写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。