Delete Node in a LinkedList

博客围绕链表中删除指定节点展开。当仅给出要删除节点的引用,找不到其前一节点时,可将后一节点的值复制到当前节点,再删除后一节点。还给出了输入为 1->2->3->4,删除 3 后输出 1->2->4 的示例。

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

Given one node in a linked list, remove that node. (Only the reference to the
specific node is given).

Examples:
Input: 1->2->3->4, 3
Output: 1->2->4

由于只给了要删除的node,因此找不到之前的node,所以我们把后面的值复制到当前node,再删除后一个node即可。
public void removeNode(ListNode node) {
	if (node == null) {
		return;
	}
	if (node.next == null) {
		node = null;
		return;
	}
	node.val = node.next.val;
	node.next = node.next.next;
	return;
}
下面的代码是干什么用的,请生成说明注释,同时还有什么改进: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> typedef struct Node { int data; struct Node* next; }Node; //struct Create_List //创建表头 Node* CreateList() { Node* HeadNode = (Node*)malloc(sizeof(Node)); //动态内存分配->结构体变量 //HeadNode->data = 0; HeadNode->next = NULL; return HeadNode; } //创建结点 Node* CreateNode(int data) { Node* NewNode = (Node*)malloc(sizeof(Node)); NewNode->data = data; NewNode->next = NULL; return NewNode; //打印结点 void printNode(Node* HeadNode) { Node* pMove = HeadNode->next; while (pMove) { printf("%d\t", pMove->data); printf("%p\n", pMove->next); pMove = pMove->next; } printf("\n"); } //头插入节点 void InsertHeadNode(Node* HeadNode, int data) { Node* NewNode = CreateNode(data); NewNode->next = HeadNode->next; HeadNode->next = NewNode; } //尾插入节点 void InsertBehindNode(Node* HeadNode, int data) { Node* NewNode = CreateNode(data); Node* p = HeadNode; while (p->next != NULL) { p = p->next; } p->next = NewNode; } // 在第pos个节点后插入新节点(pos从0开始,0表示头节点后) void InsertNodeByPos(Node* HeadNode, int pos, int data) { Node* pMove = HeadNode; int count = 0; // 找到第pos个节点 while (pMove && count < pos) { pMove = pMove->next; count++; } if (!pMove) { printf("插入位置超出链表长度!\n"); return; } // 创建新节点并插入 Node* NewNode = CreateNode(data); NewNode->next = pMove->next; pMove->next = NewNode; } //删除结点 void DeleteNode(Node* HeadNode, int DeleteData) { Node* DeleteNode = HeadNode->next; Node* DeleteNodeFront = HeadNode; if (DeleteNode == NULL) printf("链表为空,无法删除\n"); else { while (DeleteNode->data != DeleteData) { DeleteNodeFront = DeleteNode; DeleteNode = DeleteNodeFront->next; if (DeleteNode == NULL) { printf("没有找到相关信息,无法删除"); return; } } DeleteNodeFront->next = DeleteNode->next; free(DeleteNode); } } // 修改指定值的节点 void ModifyNode(Node* HeadNode, int oldData, int newData) { Node* p = HeadNode->next; while (p != NULL) { if (p->data == oldData) { p->data = newData; return; } p = p->next; } printf("未找到值为%d的节点\n", oldData); } // 查找节点并返回地址 Node* SearchNode(Node* HeadNode, int data) { Node* p = HeadNode->next; while (p != NULL) { if (p->data == data) { return p; } p = p->next; } return NULL; // 未找到 } //释放所以节点 void freeList(Node* HeadNode) { Node* p = HeadNode; int i = 0; while (p) { HeadNode = HeadNode->next; printf("释放第 %d 个元素的地址为:%p\n", ++i, p); free(p); p = HeadNode; } } int main() { Node* List = CreateList(); InsertHeadNode(List, 1); InsertHeadNode(List, 2); InsertHeadNode(List, 3); printNode(List); DeleteNode(List, 3); printNode(List); return 0; }
最新发布
06-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值