力扣hot100 删除链表的倒数第 N 个结点 快慢指针 递归回溯

Problem: 19. 删除链表的倒数第 N 个结点

文章目录

  • 思路
  • [💖 递归](#💖 递归)
  • [💖 双指针](#💖 双指针)

思路

👩‍🏫 参考题解

💖 递归

⏰ 时间复杂度: O ( n ) O(n) O(n)

🌎 空间复杂度: O ( n ) O(n) O(n)

java 复制代码
class Solution {
//	递归
	int cnt = 0;//计数器

	public ListNode removeNthFromEnd(ListNode head, int n)
	{
		if (head == null)
			return head;
		head.next = removeNthFromEnd(head.next, n);
		cnt++;//回溯时计数
		if (cnt == n)//倒数第n个节点
			return head.next;//把它的next返回
		return head;
	}
}

💖 双指针

⏰ 时间复杂度: O ( n ) O(n) O(n)

🌎 空间复杂度: O ( 1 ) O(1) O(1)

Java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
	public ListNode removeNthFromEnd(ListNode head, int n)
	{
		ListNode dummy = new ListNode(0, head);//哑兵节点,用于删除头结点
		ListNode first = head;//先行指针
		for (int i = 0; i < n; i++)
			first = first.next;
		ListNode cur = dummy;//先行指针和 cur 指针始终保持 n 的距离
		while (first != null)// first 一直移动到尾节点
		{
            // 双指针一起移动
			first = first.next;
			cur = cur.next;
		}
		cur.next = cur.next.next;//cur后面的就是要删除的节点
		return dummy.next;
	}
}
相关推荐
谷雨不太卷2 小时前
进程的状态码
java·前端·算法
散峰而望3 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
躺不平的理查德3 小时前
时间复杂度与空间复杂度备忘录
数据结构·算法
yaki_ya3 小时前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
刃神太酷啦3 小时前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode
挽星安4 小时前
代码随想录算法训练营第五十天|卡码网 99 岛屿数量、卡码网 100 最大岛屿的面积
算法
葫三生4 小时前
《论三生原理》系列构建文理同构的认知体系?
人工智能·科技·深度学习·算法·机器学习·transformer
多加点辣也没关系4 小时前
数据结构与算法|第六章:队列
数据结构·算法·队列
_深海凉_5 小时前
LeetCode热题100-分割回文串
算法·leetcode·职场和发展