小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
进阶: 你能尝试使用一趟扫描实现吗?
示例
输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]
输入: head = [1], n = 1
输出: []
输入: head = [1,2], n = 1
输出: [1]
提示
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解题思路
双指针
根据提示可以得知链表中节点数最少为1
,为了避免链表长度为1
且需要删除的情况,我们需要构造一个虚拟链表头节点将其连接起来,使得我们最终返回时有对应的入口。
同时,我们还需要创建快慢两个节点,用来计算是否达到需要删除的位置,方便删除节点。
- 创建虚拟头节点
hummy
- 创建快慢两个节点
slow, fast
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 虚拟头节点,将其与head节点进行关联
ListNode hummy = new ListNode();
hummy.next = head;
// 快慢节点
ListNode slow = hummy, fast = hummy;
// 根据需要计算倒数的位数,使得 fast 节点提前移动 n 位
while(n-- > 0){
fast = fast.next;
}
// 两个节点同时移动,直至 fast 下一节点为空
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
// 删除目标节点
slow.next = slow.next.next;
// 返回结果
return hummy.next;
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!