删除单向链表中的某一个节点

本文介绍了一种用于删除单向链表中指定节点的算法,并提供了完整的C++实现代码。通过示例展示了如何创建链表、删除指定节点及显示结果。

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

已知一个单向链表的表头head,写出一个删除某一个节点的算法,要求先找到此节点,然后删除。

#include<iostream>
using namespace std;
typedef struct node
{
	int number;
	struct node *next;
}Node;
Node *Delete(Node *head,int key)
{
	Node *node1=head;
	Node *node2=NULL;
	if (head==NULL)
	{
		return NULL;
	} 
	else
	{
		if (node1->number==key)
		{
			head=head->next;
			free(node1);
			return head;
		} 
		else
		{
			while (node1!=NULL)
			{
				node2=node1;
				node2=node2->next;
				if (node2->number==key)
				{
					node1->next=node2->next;
					free(node2);
					break;
				}
				node1=node1->next;
			}
			return head;
		}
	}
}
int main()
{
	Node *head=(Node*)malloc(sizeof(Node));
	Node *p,*q,*q1;
	int key;
	p=(Node*)malloc(sizeof(Node));
	q1=q=head;
	int i;
	for (i=1;i<10;i++)
	{
		p->number=i;
		head->next=p;
		head=p;
		p=(Node*)malloc(sizeof(Node));
	}
	head->next=NULL;
	cout<<"原链表数据: "<<endl;
	q1=q1->next;
	while (q1!=NULL)
	{
		cout<<q1->number<<" ";
		q1=q1->next;
	}
	cout<<endl;
	cout<<"输入要删除的数据:";
	cin>>key;
	p=Delete(q->next,key);
	cout<<"删除一个"<<key<<"之后的链表数据: "<<endl;
	while (p!=NULL)
	{
		cout<<p->number<<" ";
		p=p->next;
	}
	cout<<endl;
	free(p);
	free(head);
	return 0;
}


运行结果:

原链表数据:
1 2 3 4 5 6 7 8 9
输入要删除的数据:6
删除一个6之后的链表数据:
1 2 3 4 5 7 8 9

### C语言中删除链表节点的实现方法 在C语言中,删除链表中的一个节点通常涉及以下几个核心步骤: 1. **遍历链表**:为了定位到目标节点及其前驱节点,需要从节点开始逐一遍历整个链表。 2. **判断条件**:当找到满足特定条件的目标节点时(例如匹配某个数据值),记录下它的前驱节点。 3. **调整指针关系**:将前驱节点的`next`指针跳过当前节点,直接指向当前节点的下一节点,从而完成逻辑上的删除操作。 以下是具体的代码实现示例以及注意事项说明: #### 代码示例 ```c #include <stdio.h> #include <stdlib.h> // 定义单向链表结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建新节点函数 Node* create_node(int value) { Node* new_node = (Node*)malloc(sizeof(Node)); if (!new_node) { printf("内存分配失败\n"); exit(1); } new_node->data = value; new_node->next = NULL; return new_node; } // 插入节点链表部 void insert_at_head(Node** head_ref, int value) { Node* new_node = create_node(value); new_node->next = *head_ref; *head_ref = new_node; } // 打印链表 void print_list(Node* head) { while (head != NULL) { printf("%d -> ", head->data); head = head->next; } printf("NULL\n"); } // 删除指定值的第一个匹配节点 int delete_node_by_value(Node** head_ref, int key) { Node* temp = *head_ref; // 当前节点 Node* prev = NULL; // 前置节点 // 如果节点就是要删除节点 if (temp != NULL && temp->data == key) { *head_ref = temp->next; // 修改指针 free(temp); // 释放旧节点空间 return 1; // 返回成功标志 } // 遍历寻找要删除节点 while (temp != NULL && temp->data != key) { prev = temp; temp = temp->next; } // 若未找到则返回失败标志 if (temp == NULL) return 0; // 断开链接并释放节点 prev->next = temp->next; free(temp); return 1; // 成功删除 } ``` #### 关键点解析 - 节点特殊情况处理非常重要,在某些情况下可能需要更新指针[^1]。 - 使用两个辅助变量 `prev` 和 `current` 来分别跟踪前一节点和当前正在访问的节点。这有助于正确地重新连接剩余部分的链表[^2]。 - 动态内存管理方面要注意调用 `free()` 函数释放不再使用的节点所占的空间,防止造成内存泄漏[^3]. #### 注意事项 如果尝试删除不存在于列表内的项目,则应有适当反馈机制告知用户或者程序开发者此情况的发生[^4].
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值