给定一个链表,删除链表的倒数第 N 个节点,并且返回链表的头结点。
本文答案参考自leetcode官方题解。
【方法1】先遍历再删除【时间复杂度:O(L) 空间复杂度:O(1) 】
删除链表的倒数第 N 个节点 即 删除链表的 第(L - n + 1) 个节点。
因为我们不知道链表的长度L,所以我们需要先遍历一遍链表来获取L,然后再遍历链表找到要删除的位置进行删除操作。
删除的操作为:(看图,你懂我意思吧[灵光一闪])
这里我们引入 哑结点 的概念:添加一个哑结点(dummy node)作为辅助,该结点位于链表头部,用来简化某些极端情况,例如链表中只含有一个结点,或需要删除列表的头部。
【方法2】遍历的同时删除【时间复杂度:O(L) 空间复杂度:O(1) 】
使用两个指针(不妨设为 a,b ),开始时都指向哑结点。
神奇操作来了:
- 将 a 指针向前移动,使 a 和 b 相隔 N