力扣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;
	}
}
相关推荐
hsling松子9 分钟前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui12334 分钟前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝36 分钟前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O1 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King2 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家2 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain2 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-04 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20244 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh6 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝