HJ48. 从单向链表中删除指定值的节点
描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
删除 结点 2
测试用例保证输入合法
输入描述
输入一行,有以下4个部分:1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值
输出描述
输出一行输出删除结点后的序列,每个数后都要加空格
示例1
输入:
5 2 3 2 4 3 5 2 1 4 3
输出:
2 5 4 1
说明:
形成的链表为2->5->3->4->1 删掉节点3,返回的就是2->5->4->1示例2
输入:
6 2 1 2 3 2 5 1 4 5 7 2 2
输出:
7 3 1 5 4
说明:
如题C 解法, 执行用时: 2ms, 内存消耗: 280KB, 提交时间: 2021-09-29
#include <stdio.h> #include <stdlib.h> typedef struct tagNode { int val; struct tagNode *next; } Node; void insertNode(Node *head, int aim, int val) { while(head != NULL) { if(head->val == aim) { Node *temp = (Node*)malloc(sizeof(Node)); temp->val = val; temp->next = head->next; head->next = temp; return; } head = head->next; } } void delNode(Node **head, int aim) { if ((*head)->val == aim) { Node *temp = (*head)->next; free(*head); *head = temp; return; } Node *iter = *head; while (iter->next != NULL) { if (iter->next->val == aim) { Node *temp = iter->next; iter->next = temp->next; free(temp); return; } iter = iter->next; } } void printList(Node *head) { while(head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } void freeList(Node *head) { while(head != NULL){ Node *next = head->next; free(head); head = next; } } int main() { int num = 0; int headVal = 0; int delVal = 0; scanf("%d %d", &num, &headVal); Node *head = (Node*)malloc(sizeof(Node)); head->next = NULL; head->val = headVal; int i; for (i = 1; i < num; i++) { int aim = 0; int val = 0; scanf("%d %d", &val, &aim); insertNode(head, aim, val); } scanf("%d", &delVal); Node *iter = head; delNode(&head, delVal); printList(head); freeList(head); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 288KB, 提交时间: 2021-08-11
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Node{ int value; struct Node* next; }Node; typedef struct Node* LinkList; int main() { LinkList L,p,r,q; int first=0,second=0; int num=0,del=0; while(scanf("%d",&num)!=EOF) { //创建链表 L=(LinkList)malloc(sizeof(Node)); scanf("%d",&(L->value)); L->next=NULL; //插入结点 for(int i=0;i<num-1;i++) { r=L; scanf("%d %d",&first,&second); p=(LinkList)malloc(sizeof(Node)); p->value=first; while(r!=NULL) { if(r->value==second) { p->next=r->next; r->next=p; break; } r=r->next; } } //移除结点 scanf("%d",&del); r=L; q=r->next; while(q!=NULL) { if(q->value==del) { r->next=q->next; q=r->next; } else { r=r->next; q=q->next; } } if(L->value==del) { L=L->next; r=L; q=r->next; } //打印链表 q=L; while(q!=NULL) { printf("%d ",q->value); q=q->next; } } return 0; }