首页 > 其他分享 >04删除倒数第n个节点

04删除倒数第n个节点

时间:2023-10-11 19:11:21浏览次数:32  
标签:dummyHead ListNode val 04 fast next 节点 倒数第

我的

想法:

  • 找到倒数第n-1个节点,通过遍历

问题:

* 需要准确计算需要循环多少次才能找到第n-1个节点。
* 假如有5个节点,要删除倒数第2个节点,有个虚拟头结点的情况下,用count=0计数需要遍历第一次,到第一个节点,count=1,遍历第二次,到第二个节点,count=2,当count==n-1时,不再遍历,此时curr指针指的就是第n-1个节点

正确

思路:

利用双指针距离差一起走,距离差正好是倒数第n个节点前一个位置和链表最后一个节点

适用场景:

双指针:两个指针的距离差;两个指针间的元素关系

代码

//题目:
#include <iostream>
using namespace std;
#include <vector>

//解决方法
class Solution
{
public:
	//方法
	// 链表节点
	struct ListNode {
		int val;
		ListNode* next;
		ListNode() : val(0), next(nullptr) {}
		ListNode(int val) : val(val), next(nullptr){}
	};
	//返回链表,移除倒数第n个元素
	ListNode* removeNthFromEnd(ListNode* Head, int n) {
		//初始化虚拟头结点
		ListNode* dummyHead = new ListNode(0);
		dummyHead = Head->next;
		//双指针初始化
		ListNode* slow = dummyHead;
		ListNode* fast = dummyHead;

		//先把fast指针往前移动n+1个位置
		while (n-- && fast != nullptr) {	//防止n大于链表长度
			fast = fast->next;

		}
		fast = fast->next;

		//移动两个指针
		while (fast) {
			slow = slow->next;
			fast = fast->next;

		}
		//删除节点,此时slow是待删除节点的前一节点
		slow->next = slow->next->next;
		
		return dummyHead->next;
	}
	
	

};
class LinkedList
{
public:
	//初始化链表
	LinkedList() {
		_dummyHead = new Solution::ListNode(0);
		_size = 0;
	}
	//头插法
	void addAtHead(int val) {
		Solution::ListNode* newNode = new Solution::ListNode(val);
		newNode->next = _dummyHead->next;
		_dummyHead->next = newNode;
		_size++;
	}
	void printList() {
		Solution::ListNode* curr = _dummyHead->next;
		while(curr) {
			cout << curr->val << " ";
			curr = curr->next;
		}
		cout << endl;
	}
private:
	int _size;
	Solution::ListNode* _dummyHead;
};
//主函数
int main()
{
	/*int a[] = {0};
	int target = 0;

	vector<int> nums(a, a + sizeof(a) / sizeof(a[0]));

	Solution solution;
	cout << "方法调用" << endl;*/
	LinkedList linklist;

	linklist.addAtHead(2);

	linklist.printList();

	return 0;
}


学习到

代码编写过程中

  1. removeNthFromEnd:移除倒数第N个
  2. n-- && fast != nullptr:代码直观简单易懂,isNull,
  3. fast != nullptr:要考虑到每种情况都出现的后果

代码调试过程中

代码思维

标签:dummyHead,ListNode,val,04,fast,next,节点,倒数第
From: https://www.cnblogs.com/97rong/p/17757954.html

相关文章

  • 在Ubuntu22.04上安装MySQL-Server,并配置可视化界面SQL-Workbench
    在Ubuntu22.04上安装MySQL-Server,并配置可视化界面MySQL-Workbench彻底删除MySQL若您是首次,在Ubuntu22.04上崭新安装mysql,可以略过该步。首先卸载mysql-common:sudoapt-getremovemysql-common然后卸载已经安装的mysql-server:sudoapt-getautoremove--purgemysql-ser......
  • 问题:出现404错误页面的原因
    404错误原因:服务器找不到请求的网页。可能的原因有:1.管理员将原始的网页数据更改,导致网页失效。2.上传到网页的文件目录或文件名称被更改,导致原网页失效。3.上传到网页的文件被移动或被删除也可能导致原链接失效。4.输入的网址有错误,不能连接到所需的文件。......
  • 深入学习JVM04 线程与变量
    18JVM中的变量在food背后,有一个与它对应的klass对象,它记录了food的类型信息,就像是有一个标签写着food的品类和特点。每个klass对象维护着一个虚函数表,记录了类中所有的虚函数以及对应的指针。当food调用一个方法时,JVM根据它的实际类型找到它的klass对象,然后在虚函......
  • 04-Shell字符串变量
    1.字符串变量的三种方式字符串(String)就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)单引号方式双引号方式,推荐不用引号方式var='abc'var2="abc"var3=abc1.1三种格式的区别使用单引号''的字符串:任......
  • 2021-2022 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2021) gym 104670
    原题容易想到最短路DAG求出来,起初我以为要求最小割,但这是错误的,因为可能有多条边联通了一个点的情况,这时候选择最小割不一定是最优的我们猜想一个思路:答案一定是包含\(1\)号节点的连通块全部填\(N\),剩下的填\(S\)。发现在最短路DAG中,\(1\rightarrown\)的所有路径......
  • HCIE-广域承载解决方案专题04-SRv6概念和工作原理
    HCIE-广域承载解决方案专题04-SRv6概念和工作原理SRv6概述SegmentRouting架构设计之初,就为数据平面设计了两种实现方式:一种是SR-MPLS,其复用了MPLS数据平面,可以在现有IP/MPLS网络上增量部署;另一种是SRv6,使用IPv6数据平面,基于IPv6路由扩展头进行扩展。SRv6技术本身可以简化现有......
  • Jenkins 配置MAC节点,编译iOS项目
     文章主要介绍Jenkins主从节点配置,mac机配置slave节点。从机已经搭建android和ios编译环境为例,介绍Jenkins节点配置。环境介绍主机环境介绍:主机Jenkins运行在tomcat中。Jenkins本身安装的环境仅包括java环境和gradle环境。#setjavaenvironmentexportJAVA_HOME=/usr......
  • day 1 数组 704.二分查找、27.移除元素
    704.二分查找题目链接:704.二分查找视频教程文章教程思路利用middle去寻找target前提条件:这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,二分查找法返回的元素下标可能就不唯一,这些都是二分法的前提,以后看到题目描述后可以先想一想......
  • 83、删除链表重复节点
    Givenasortedlinkedlist,deleteallduplicatessuchthateachelementappearonlyonce.Forexample,Given1->1->2,return1->2.Given1->1->2->3->3,return1->2->3 publicListNodedeleteDuplicates(ListNodehead){if(head=......
  • MySQL数据库报 1040 too many connection
    找个是因为超过了最大的连接数你把最大的连接数改一下就可以了  改完之后记得重启mysqlwindows+R cmd进入黑窗口 ......