[LeetCode] 19. 删除链表的倒数第 N 个结点
1. 问题描述
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
2. 实现思路
2.1 自己的思路
~~(一定要写出来啊喂)~
- 先遍历一遍获取链表长度,再结合虚拟头节点删除
public class Solution
{
public ListNode RemoveNthFromEnd(ListNode head, int n)
{
var dummyHead = new ListNode(0, head);
var preHead = dummyHead;
var temp = dummyHead;
int count = 0;
while (temp.next != null)
{
count++;
temp = temp.next;
}
for (int i = 0; i < count - n; i++)
preHead = preHead.next;
preHead.next = preHead.next?.next;
return dummyHead.next;
}
}
2.2 题解思路
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
public class Solution {
public ListNode RemoveNthFromEnd(ListNode head, int n) {
ListNode dummpHead = new ListNode(0);
dummpHead.next = head;
var fastNode = dummpHead;
var slowNode = dummpHead;
while(n-- != 0 && fastNode != null)
{
fastNode = fastNode.next;
}
while(fastNode.next != null)
{
fastNode = fastNode.next;
slowNode = slowNode.next;
}
slowNode.next = slowNode.next.next;
return dummpHead.next;
}
}
- 时间复杂度: O(n)
- 空间复杂度: O(1)
2.3 优化(或者敲一遍题解?)
好的也是很经典的双指针啊
public class Solution
{
public ListNode RemoveNthFromEnd(ListNode head, int n)
{
var dummyHead = new ListNode(0, head);
var fast = dummyHead.next;
var slow = dummyHead;
while (n-- != 0)
fast = fast.next ?? null;
while (fast != null)
{
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next?.next;
return dummyHead.next;
}
}
3. 补充知识と杂谈,总结
不过有一说一,也是第一次花十多分钟解出一个mid难度的题,虽然离最优解还差一些距离
但从写完这篇笔记来看一共花了二十四分钟,嗯嗯以后也继续保持叭~每个题都控制在半个小时以内喵

浙公网安备 33010602011771号