C++删除单链表指定元素

C++删除单链表指定元素

对于C++单链表的创建与打印操作之前已经讲述过,那么普通的元素删除也可以很容易实现。在力扣203.移除链表元素中提出了一种元素删除操作,题目如下:
在这里插入图片描述

本来觉得很简单,但是在实现的过程中遇到了很多问题。这道题目的棘手之处就在于头结点的处理上,我们知道如果想要删除一个节点,只要让待删除节点前驱的Next指向待删除节点的后继即可,那么如果头结点就是待删除的呢?对于头结点并不存在前驱,而且C++在堆区开辟的内存空间是需要手动释放的,所以具体代码实现起来还是要花费点功夫的,具体来说实现方式有两种。

方式一:无虚拟头结点

struct ListNode {
   

	int val;//结点值
	ListNode *Next;//指向后继结点
	ListNode(int x) :val(x), Next(NULL) {
   }//有参构造函数
};

ListNode *removeElements(ListNode *Head,int val)//删除指定元素
{
   
	if (Head == NULL) return Head;//如果输入空链表,直接返回
	while (Head->val == val) //判断头结点的元素值
	{
                          //头结点就是待删除元素
		    ListNode *temp = Head;//保存头结点,方便内存释放
			Head = Head->Next;//更新头结点,指向后继
			delete temp;//释放内存
	}
	//进入这里说明头结点不是待删除元素,要对非头节点操作
	ListNode *p = Head;//p指向头结点,需要判断p的后继是否为待删除元素
	while ((p->Next) != NULL)//p的后继不能为空
	{
   
		if ((p->Next)->val == val)//p的后继为待删除元素
		{
   
			ListNode 
  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是C++实现单链表的示例代码: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; // 定义链表类 class LinkedList { private: ListNode* head; public: LinkedList() { head = NULL; } // 在链表末尾添加节点 void append(int val) { ListNode* node = new ListNode(val); if (head == NULL) { head = node; } else { ListNode* curr = head; while (curr->next != NULL) { curr = curr->next; } curr->next = node; } } // 在链表指定位置插入节点 void insert(int val, int pos) { ListNode* node = new ListNode(val); if (pos == 0) { node->next = head; head = node; } else { ListNode* curr = head; for (int i = 0; i < pos - 1; i++) { if (curr == NULL) { cout << "插入位置超出链表长度" << endl; return; } curr = curr->next; } node->next = curr->next; curr->next = node; } } // 删除链表指定位置的节点 void remove(int pos) { if (pos == 0) { head = head->next; } else { ListNode* curr = head; for (int i = 0; i < pos - 1; i++) { if (curr == NULL || curr->next == NULL) { cout << "删除位置超出链表长度" << endl; return; } curr = curr->next; } curr->next = curr->next->next; } } // 获取链表指定位置的节点值 int get(int pos) { ListNode* curr = head; for (int i = 0; i < pos; i++) { if (curr == NULL) { cout << "获取位置超出链表长度" << endl; return -1; } curr = curr->next; } return curr->val; } // 获取链表长度 int size() { int count = 0; ListNode* curr = head; while (curr != NULL) { count++; curr = curr->next; } return count; } // 打印链表 void print() { ListNode* curr = head; while (curr != NULL) { cout << curr->val << " "; curr = curr->next; } cout << endl; } }; int main() { LinkedList list; list.append(1); list.append(2); list.append(3); list.print(); // 输出: 1 2 3 list.insert(4, 1); list.print(); // 输出: 1 4 2 3 list.remove(2); list.print(); // 输出: 1 4 3 cout << list.get(1) << endl; // 输出: 4 cout << list.size() << endl; // 输出: 3 return 0; } ``` 在上述代码中,我们定义了链表节点结构体`ListNode`,其中包含一个整型变量`val`和一个指向下一个节点的指针`next`;定义了链表类`LinkedList`,其中包含各种操作链表的函数,例如:在链表末尾添加节点、在链表指定位置插入节点删除链表指定位置的节点等等。在`main()`函数中,我们初始化了一个链表对象`list`,并对其进行了各种操作,最后输出了链表中的元素

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值