力扣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;
	}
}
相关推荐
graceyun6 分钟前
C语言初阶习题【24】调整奇数偶数顺序
c语言·数据结构·算法
初学者丶一起加油8 分钟前
C语言基础:野指针、空指针、空悬指针
java·linux·c语言·开发语言·数据结构·算法·vim
Channing Lewis12 分钟前
给定一个字符串,对该字符串进行删除操作,保留 k 个字符且相对位置不变,使字典序最小
python·算法
新威考研38 分钟前
输出fibonacci数列的第n项的各种算法分析
算法
大丈夫立于天地间1 小时前
OSPF - 特殊区域
网络·网络协议·学习·算法·信息与通信
数维学长9861 小时前
C++ STL 中的 `unordered_map` 和 `unordered_set` 总结
c++·算法·哈希算法
fnd_LN1 小时前
C语言二级刷题---填空题01
c语言·算法
7yewh2 小时前
【LeetCode】力扣刷题热题100道(6-10题)附源码 相交链表 回文链表 反转链表 合并链表 移动零(C++)
c语言·数据结构·c++·算法·leetcode·链表·贪心算法
DARLING Zero two♡2 小时前
【优选算法】Simulation-Phoenix:模拟算法的重生涅槃
java·数据结构·c++·算法·leetcode
Cosmoshhhyyy3 小时前
LeetCode:165. 比较版本号(双指针 Java)
java·python·leetcode