IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣删除链表的倒数第N个节点 -> 正文阅读

[数据结构与算法]力扣删除链表的倒数第N个节点

题目描述 :

力扣删除链表的倒数第N个节点
在这里插入图片描述
示例1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例2:

输入:head = [1], n = 1
输出:[]

示例3:

输入:head = [1,2], n = 1
输出:[1]

解题所用的数据结构与算法:

链表;双指针。

解题思路:

  • 思路1:(暴力求取长度遍历法)由于题目要求删除链表的倒数第n个元素,所以我们可以先写一个辅助函数求取链表的长度,然后再定义一个前驱指针pre指向表头,再让前驱指针移动链表长减去n减一步到达待删除结点的前一个结点,再实现删除的操作!!!
  • 思路2:(快慢双指针)我们避免求取链表长度,就分别让快慢指针分别指向头节点,第一次让快指针移动n次移动到距离尾节点相差n-1个节点的位置,也就是待删除节点的后一位!此时快指针与慢指针之间相差n个节点,再让慢指针和快指针同时移动,当快指针到底尾节点时停止,此时快慢指针均移动n-2步,也就是尾节点与第一次快指针指向节点之间相差的节点数目!!!。此时快指针与慢指针之间还是相差n个节点由于第一次快指针与尾部节点相差n-2个节点,此时慢指针与指向尾部节点的快指针还是相差n个节点,所以此时的慢指针与快指针第一次指向的节点位置处相差n - (n-2) = 2个节点,但是我们是知道第一次移动快指针的位置是到待删除节点的下一位,所以**此时的慢指针就在待删除节点的前一位!!!*** ,(看下面的图示!!!)

在这里插入图片描述

代码块:

1.解法一代码块:

class Solution{
	public ListNode removeNthFromEnd(ListNode head, int n) {
		//定义前驱节点
		ListNode pre = head;
		int last = length(head) - n;
		//待删除的是头节点
		if (last == 0) {
			return head.next;
		}
		//将前去驱节点移动到待删除节点的前一个节点
		for (int i = 0; i < last - 1; i++) {
			pre = pre.next;
		}
		//删除操作
		pre.next = pre.next.next;
		return head;
	}
	//求取链表的长度
	private int length(ListNode head) {
		int len = 0
		while (head != null) {
			len++;
			head = head.next;
		}
		return len;
	}
}

2.解法二代码块:

class Solution {
	public ListNode removeNthFromEnd(ListNode head, int n) {
	//定义快慢指针,并均指向头节点
	ListNode fast = head;
	ListNode slow = head;
	
	//将fast移动n步,移动到待删除节点的下一位
	for (int i = 0; i < n; i++) {
		fast = fast.next;
		}
		//如果fast为空,表示删除的是头节点
		if (fast == null) {
			return head.next;
			}
		
		//fast与slow同时移动
		while(fast.next != null) {
			fast = fast.next;
			slow = slow.next;
		}
		//此处slow移动到待删除节点的前一位
		//删除操作
		slow.next = slow.next.next;
		return head;
	}
}

代码复杂度分析:

1.解法一:暴力遍历主要是求取链表的长度没有开辟额外的空间,所以时间复杂度为**O(N)**其中N为链表的长度,空间复杂度为O(1).
2.解法二:双指针法也平均时间复杂度为O(N),空间复杂度为:O(1).

做题感悟与总结:

对于双指针方法本人在学习了别人的方法后虽然可以以一个特例搞懂操作,但是别人的代码没有给出严格的证明,自己想那个数学证明也是花费了好多时间,只能说数理逻辑真的好重要。对于本题目一定要搞清楚指针是移动到了待删除节点还是其他的节点,对于链表的基本操作和概念一定要牢牢掌握!!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:25:11  更:2022-10-31 12:30:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 6:48:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码