链表5--------删除

代码

cpp 复制代码
void LinkedList::remove(int i) {//删除函数
	if (i<0 || i>size) {//判断输入是否合法
		throw out_of_range("Invalid Position");
	}
	if (i == 0) {//判断删除的是否是头节点
		ListNode* temp = head;//暂存头节点
		head = head->next;//将头节点的后继节点置为新的头节点
		delete temp;//释放原头节点对应的内存
	}
	else {
		ListNode* curr = head;//依旧暂存头节点
		for (int j = 0; j < i - 1; j++) {
			curr = curr->next;
		}
		ListNode* temp = curr->next;//把要删除的元素暂存在temp里面
		curr->next = temp->next;
		delete temp;
	}
	size--;
}

解释

void LinkedList::remove(int i) {//删除函数首先是返回值类型,由于删除不需要返回什么东西,所以是void,然后它要调用类内的成员变量,就加入了作用域,LinkedList:: 然后remove代表删除,参数列表有一个元素是删除元素的索引位。

cpp 复制代码
if(i<0||i>size){
    throw out_of_range("Invalid Position!");
}

函数体内部首先是判断输入是否异常。

cpp 复制代码
if (i == 0) {//判断删除的是否是头节点
		ListNode* temp = head;//暂存头节点
		head = head->next;//将头节点的后继节点置为新的头节点
		delete temp;//释放原头节点对应的内存
	}

首先判断带删除元素是否是第一个元素,然后是,则声明结构体指针暂存头节点(为什么一定要让一个结构体指针指向头节点呢,因为头节点本身作为一个节点,应该包含数据域和指针域两个部分,所以头节点本身就是一个结构体类型的量,里面存放着数据域和指针域),然后把头节点的后继存储的地址赋值给头节点,然后销毁旧头节点的内存空间。

cpp 复制代码
else {
		ListNode* curr = head;//依旧暂存头节点
		for (int j = 0; j < i - 1; j++) {
			curr = curr->next;
		}
		ListNode* temp = curr->next;//把要删除的元素暂存在temp里面
		curr->next = temp->next;
		delete temp;
	}

如果删除元素不是第一个元素,那就先用结构体指针curr暂存头节点,然后利用for循环遍历链表,遍历到curr指向待删除位置的前驱节点,然后声明结构体指针temp暂存待删除结点,然后将curr的后继节点置为temp的后继节点,然后释放temp指向的也就是待删除元素对应的内存空间。

**size--;**最后让链表长度-1。

相关推荐
号码认证服务14 小时前
客户看到来电显示公司名会更愿意接听吗?企业号码认证提升ROI
服务器·网络·c++·经验分享·智能手机·云计算·php
Controller-Inversion14 小时前
23. 合并 K 个升序链表
数据结构·链表
拉拉拉拉拉拉拉马14 小时前
Windsurf 最新版进阶讲解:从 Cascade 到 Devin Local,重新理解 AI 编程工作流
人工智能·算法
流年如夢14 小时前
初入C++
开发语言·c++
Mr_pyx14 小时前
面试题记录
jvm·数据结构·算法·spring·mybatis
zzzsde14 小时前
【Linux】线程同步和互斥(1):线程互斥与加锁实现
linux·运维·服务器·开发语言·算法
yoyo_zzm14 小时前
编程语言大比拼:C++到PHP全解析
开发语言·c++·php
努力努力再努力wz14 小时前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
水饺编程15 小时前
编程基础:令牌粘贴指令,【##】
c语言·c++·windows·visual studio
basketball61615 小时前
C 的 malloc/free 与 C++ 的 new/delete 一些区别
c语言·开发语言·c++