力扣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;
	}
}
相关推荐
垠二1 小时前
L2-4 寻宝图
数据结构·算法
a_j583 小时前
算法与数据结构(环形链表)
数据结构·链表
东方芷兰4 小时前
算法笔记 04 —— 算法初步(下)
c++·笔记·算法
JNU freshman4 小时前
图论 之 迪斯科特拉算法求解最短路径
算法·图论
青松@FasterAI4 小时前
【NLP算法面经】本科双非,头条+腾讯 NLP 详细面经(★附面题整理★)
人工智能·算法·自然语言处理
旅僧5 小时前
代码随想录-- 第一天图论 --- 岛屿的数量
算法·深度优先·图论
Emplace5 小时前
ABC381E题解
c++·算法
若兰幽竹5 小时前
【机器学习】衡量线性回归算法最好的指标:R Squared
算法·机器学习·线性回归
居然有人6546 小时前
23贪心算法
数据结构·算法·贪心算法
SylviaW087 小时前
python-leetcode 37.翻转二叉树
算法·leetcode·职场和发展