删除数组中的元素(链表)

这篇博客记录了作者在学习链表时遇到的挑战,尤其是删除特定元素这一难点。作者通过一天的努力,成功实现了删除链表中指定元素的函数,并提供了完整的C++代码实现。博客中包含了链表的创建、遍历以及删除操作,对于初学者具有很好的参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 链表对初学者来说真的很难,这题我研究了一天,在自己不断的调试和查找资料下,终于过了!

#include<iostream>
#include<stdlib.h>
using namespace std;
struct node
{
	int data;
	node * next;
};
void printList(node * head)
{
	node * p = NULL;
	p = head;
	while (p!=NULL)
	{
		cout << p->data << " ";
		p = p->next;
	}
}
node * dltElemenx(node * head, int x)
{
	node * p = NULL, * bp = NULL; //bp是p前面的指针,用来删除结点后连接。
	p = head;
	while (p) //找x并删除。
	{
		if (head->data==x)
		{
			head = head->next;
			p = head;
		}
		else if (p->data == x)
		{
			if (p->next == NULL)
			{
				bp->next = NULL;
				p = NULL;
			}
			else
			{
				bp->next = p->next;
				p = p->next;
			}
		}
		else
		{
			bp = p;
			p = p->next;
		}
	}
	return head;
}
void linkList(int n)
{
	node * head = NULL, *p = NULL, *r = NULL; //建立一个长度为n的链表。
	head = (node *)malloc(sizeof(node));
	if (head == NULL)
	{
		cout << "Memory Failed!" << endl;
		return;
	}
	int num;
	cin >> num;
	head->data = num;
	head->next = NULL;
	p = head;
	for (int i = 1;i < n;i++)
	{
		r = (node *)malloc(sizeof(node));
		p->next = r;
		cin >> num;
		r->data = num;
		p = r;
		p->next = NULL;
	} //链表建好了。
	int k;
	cin >> k;
	head = dltElemenx(head, k); //因为被删掉的可能是链表的第一个元素,所以头指针会改变。因此我们可以返回头指针。
	printList(head);
}
int main()
{
	int n;
	cin >> n;
	linkList(n);
	return 0;
}
<think>嗯,用户想在C++删除数组链表元素。首先,我得回忆一下数组链表的不同结构。数组是连续的内存,删除元素需要移动后面的元素,而链表通过指针连接,删除只需调整相邻节点的指针。 然后,我得考虑具体怎么操作。数组的话,可能需要用循环把后面的元素前移,覆盖掉要删除元素。比如用户给的那个例子,引用[2]提到插入或删除会导致其他元素移动,所以要用循环。那具体步骤应该是找到目标元素的位置,然后从那个位置开始,把后面的元素都往前移一位,最后更新数组长度。 对于链表,用户提供的代码里有Solution类使用虚表头指针,这应该是指虚拟头节点,方便处理头节点的删除。引用[1]里的代码示例中,removeElements方法应该是遍历链表,找到匹配的节点,然后修改指针绕过该节点。需要注意的边界情况是头节点和尾节点的处理,以及内存释放的问题。 用户还提到了数组模拟链表的方法,引用[3]中的数组模拟链表可能用索引来管理节点,比如用两个数组分别存储前驱和后继的索引。这种方法在删除时只需更新相邻节点的索引,不需要实际删除数据,这样效率更高,但可能对新手来说有点抽象。 另外,引用[4]提到了STL中的const_iterator和iterator的区别,可能涉及到使用标准库中的容器,比如vector和list。用户可能想知道如何用STL的方法删除元素,比如vector的erase方法或者list的erase,但需要处理迭代器失效的问题。 总结一下,用户需要的是数组链表删除元素的具体步骤,包括手动实现和使用STL的方法。要分情况讨论,数组删除需要移动元素链表需要调整指针,数组模拟链表则是更新索引,而STL容器则有内置的erase方法,但要注意迭代器的有效性。</think>### 如何在C++删除数组链表中的元素 #### 一、删除数组元素的方法 数组的存储特性为连续内存,删除元素需要移动后续元素以保证连续性[^2]。 **步骤说明**: 1. **定位目标元素**:遍历数组找到待删除元素的位置$i$ 2. **覆盖移动元素**:从$i+1$位置开始,将后续元素依次向前移动一位 3. **更新数组长度**:若使用动态数组(如`vector`),需调整数组有效长度 **代码示例**: ```cpp int a[] = {1,2,3,4,5}; int len = 5; int target = 3; for(int i=0; i<len; i++){ if(a[i] == target){ for(int j=i; j<len-1; j++){ // 后续元素前移 a[j] = a[j+1]; } len--; // 更新有效长度 break; } } ``` #### 二、删除链表元素的方法 链表通过指针连接节点,删除操作只需调整相邻节点的指针[^1][^3]。 **核心步骤**: 1. **处理头节点**:使用虚表头指针简化头节点删除操作 2. **遍历查找目标**:通过循环定位待删除节点 3. **调整指针连接**:将前驱节点的`next`指向待删除节点的后继 4. **释放内存**:删除动态分配的节点内存 **代码示例(单向链表)**: ```cpp struct ListNode { int val; ListNode* next; }; ListNode* removeElements(ListNode* head, int val) { ListNode* dummy = new ListNode(0); // 虚表头指针 dummy->next = head; ListNode* cur = dummy; while(cur->next) { if(cur->next->val == val) { ListNode* tmp = cur->next; cur->next = cur->next->next; delete tmp; // 释放内存 } else { cur = cur->next; } } return dummy->next; } ``` #### 三、数组模拟链表的高效操作 通过数组索引实现链表结构,适合算法竞赛场景[^3]: ```cpp const int N=100010; int e[N], l[N], r[N], idx; // 删除第k个元素 void remove(int k){ r[l[k]] = r[k]; l[r[k]] = l[k]; } ``` #### 四、STL容器操作 1. **vector删除元素**: ```cpp vector<int> vec{1,2,3,4}; vec.erase(vec.begin()+2); // 删除第三个元素 ``` 2. **list删除元素**: ```cpp list<int> lst{1,2,3,4}; auto it = lst.begin(); advance(it, 2); lst.erase(it); // 删除第三个元素 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值