【算法系列-链表】删除链表的倒数第N个结点
文章目录
- 【算法系列-链表】删除链表的倒数第N个结点
- 1. 算法分析🛸
- 2. 模拟解决问题
- 2.1 思路分析🎯
- 2.2 代码示例🌰
- 3. 双指针(快慢指针)解决问题
- 3.1 思路分析🎯
- 3.2 代码示例🌰
【题目链接】 LeetCode 19 删除链表的倒数第N个结点
1. 算法分析🛸
这道题的关键点在于找到删除节点的位置,而题目提供给我们的是倒数第n个节点的位置,对此我们需要通过操作找到这倒数第n个节点,这里我提供两种方法:模拟 & 双指针
2. 模拟解决问题
2.1 思路分析🎯
通过一轮循环遍历来获取链表的长度 size,而 size - n
的位置就是目标删除节点的前一个节点,通过它来删除目标节点即可
2.2 代码示例🌰
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode vhead = new ListNode();
vhead.next = head;
ListNode cur = vhead;
int size = 0;
while (cur != null && cur.next != null) {
cur = cur.next;
size++;
}
cur = vhead;
for (int i = 0;i < size - n;i++) {
cur = cur.next;
}
cur.next = cur.next.next;
return vhead.next;
}
}
3. 双指针(快慢指针)解决问题
3.1 思路分析🎯
这里使用了双指针(快慢指针)来解决问题,定义快慢指针先指向虚拟头节点,之后让 fast 先走 n + 1 步(这里比n 多走一步是为了让slow到达删除节点的前一个节点,方便我们进行节点删除操作),后让slow 和 fast 同时往后遍历,直到 fast 指向空,此时slow所处位置的下一个节点就是目标删除节点,进行删除操作即可
通过图解大家能更好理解:
3.2 代码示例🌰
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode vhead = new ListNode();
vhead.next = head;
ListNode fast = vhead;;
ListNode slow = vhead;
for (int i = 0;i <= n;i++) {
fast = fast.next;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return vhead.next;
}
}
以上便是对删除链表的倒数第N个结点类型题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨