持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
给你一个链表,删除链表的倒数第 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 <= 300 <= Node.val <= 1001 <= n <= sz
解题思路:(双指针)
本题可以使用双指针来做题
如果要删除倒数n个节点,只需要让右指针right向右移动n步,再让left和right共同向右移动,直到右指针到链表末尾,这时候,left指向的节点正是我们想要删除掉的那个节点。
因为题中有涉及到删除的操作,我这里就需要创建一个虚节点来完成这个操作,这样做方便些
具体步骤:
- 定义两个指针
left,right,分别指向链表的虚拟头节点 right向右移动n步left跟right共同向右移动- 这里有一个要注意的点:因为左指针指向的节点恰好是我们要删除的节点,这就导致我们没办法直接删除这个节点。
- 我们还需要一个指针
per,让指针per指向要删除节点的上一个节点,当左指针指向要删除的节点时,我们可以通过per.next = left.next这个操作来删除节点 - 最后返回头节点即可
代码: (Java实现)
//创建虚节点
ListNode list = new ListNode(-1);
list.next = head;
ListNode left = dummy;
ListNode right = dummy;
ListNode per = null;
//进行right的移动
while (n > 0) {
right = right.next;
n--;
}
while (right != null) {
per = left;
left = left.next;
right = right.next;
}
//
per.next = left.next;
return dummy.next;
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)