在一行上:
先输入一个整数
代表链表中节点的总数;
随后输入一个整数
代表头节点的值;
随后输入
个二元组
;
最后输入一个整数
,代表需要删除的节点值。
除此之外,保证每一个
值在输入前已经存在于链表中;每一个
值在输入前均不存在于链表中。节点的值各不相同。
在一行上输出
个整数,代表删除指定元素后剩余的链表。
5 2 3 2 4 3 5 2 1 4 3
2 5 4 1
在这个样例中,链表的构造过程如下:
头节点为
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
随后,删除值为
的节点,得到链表
。
6 2 1 2 3 2 5 1 4 5 7 2 2
7 3 1 5 4
在这个样例中,链表的构造过程如下:
头节点为
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
随后,删除值为
的节点,得到链表
。
本题由牛客重构过题面,您可能想要阅读原始题面,我们一并附于此处。
【以下为原始题面】
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:6 2 1 2 3 2 5 1 4 5 7 2 2则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:1 2 表示为2->1链表为2->13 2表示为2->3链表为2->3->15 1表示为1->5链表为2->3->1->54 5表示为5->4链表为2->3->1->5->47 2表示为2->7链表为2->7->3->1->5->4最后的链表的顺序为 2 7 3 1 5 4最后一个参数为2,表示要删掉节点为2的值删除 结点 2
则结果为 7 3 1 5 4数据范围:链表长度满足,节点中的值满足
测试用例保证输入合法
#include <stdio.h> #include <stdlib.h> struct Item { int value; struct Item* next; }; //2 int insertValue(struct Item* head, int cur, int prev) { // 4 1 struct Item* next = head; for (; next != 0; next = next->next) { if (prev == next->value) { break; } } if (0 == next) { return -1; } struct Item* temp = malloc(sizeof(struct Item)); temp->value = cur; temp->next = next->next; next->next = temp; return 0; } // 2 5 3 4 1 int deleteValue(struct Item **head, int value) { struct Item *next = *head; struct Item *prev = *head; for (; next != 0; next = next->next) { //2,5,3,4 if (value == next->value) { break; } prev = next;//2,5,3,4 } if(0 == next){ printf("error:can't found %d in list\n", value); return -1; }else if(*head == next){ struct Item *temp = (*head)->next; free(*head); *head = temp; return 0; }else { prev->next = next->next; free(next); } return 0; } void printList(struct Item* head) { struct Item* next = head; for (; next != 0; next = next->next) { printf("%d ", next->value); } printf("\n"); } int main() { int total; int value; struct Item* head = 0; //5 2 3 2 4 3 5 2 1 4 1 scanf("%d", &total); //5 scanf("%d", &value); //2 head = malloc(sizeof(struct Item)); head->value = value; head->next = 0; total--; while (total--) { int cur; int prev; scanf("%d %d", &cur, &prev); insertValue(head, cur, prev); } int delete; scanf("%d", &delete); deleteValue(&head, delete); printList(head); return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct NodeList{ int val; struct NodeList* next; }*List, Node; void InsertNode(List L, int curVal, int beforeVal) { Node* node = (Node*)malloc(sizeof(Node)); node->val = curVal; List p = L; p = p->next; while(p != NULL){ if(p->val == beforeVal){ node->next = p->next; p->next = node; break; }else{ p = p->next; } } } void DeleteVal(List L, int val) { List p = L; while(p->next != NULL){ if(p->next->val == val){ p->next = p->next->next; break; } p = p->next; } } int main() { int n; List L = (List)malloc(sizeof(Node)); int head; int delVal; scanf("%d", &n); scanf("%d", &head); L->val = 0; Node* headNode = (Node*)malloc(sizeof(Node)); headNode->val = head; headNode->next = NULL; L->next = headNode; for(int i = 1; i < n; i++){ int beforeVal, curVal; scanf("%d %d", &curVal, &beforeVal); InsertNode(L, curVal, beforeVal); } scanf("%d", &delVal); DeleteVal(L, delVal); L = L->next; while(L != NULL){ printf("%d ", L->val); L = L->next; } return 0; }
#include <stdio.h> #include <string.h> typedef struct Node { //链表定义 int data; struct Node* next; }* LinkList, LNode; void Add(LinkList L, int n1, int n2) { //在值为n1的节点后插入值为n2的节点 LNode* nextNode = (LNode*)malloc(sizeof(LNode)); nextNode->data = n2; nextNode->next = NULL; LNode* p = L->next; //记录第一个元素 while (p) { if (p->data == n1) { nextNode->next = p->next; p->next = nextNode; break; } else { p = p->next; } } } void Delete(LinkList L, int n3) { //删除值为n3的节点 LNode* prior = L; //记录前一个元素 LNode* p = L->next; //记录当前元素 while (p) { if (p->data == n3) { prior->next = p->next; free(p); p = NULL; break; } else { prior = p; p = p->next; } } } int main() { int n, first_value; scanf("%d %d", &n, &first_value); LinkList L = (LNode*)malloc(sizeof(LinkList)); L->next = NULL; //初始化表头结点 L->data = 0; LNode* firstNode = (LNode*)malloc(sizeof(LNode)); //插入第一个元素 firstNode->data = first_value; firstNode->next = NULL; L->next = firstNode; for (int i = 0; i < n - 1; i++) { int next_value = 0; int now_value = 0; int de_value = 0; scanf("%d %d", &next_value, &now_value); Add(L, now_value, next_value); if (i == n - 2) { scanf("%d", &de_value); Delete(L, de_value); } } //打印输出最后的结果 while (L->next) { printf("%d ", L->next->data); L = L->next; } return 0; }
#include <stdio.h> struct NODE { int value; struct NODE *next; }; struct NODE *head, *cur; int main() { int i, j, k, m, n; scanf("%d ", &n); struct NODE node[n]; memset(node, 0x00, sizeof(node)); scanf("%d ", &node[0].value); node[0].next = NULL; head = &node[0]; k = 1; // 节点依次加入 for(i = 1; i < n; i++) { scanf("%d %d", &node[k].value, &m); if(m == head->value) { node[k].next = head->next; head->next = &node[k]; } else { cur = head; while(1) { cur = cur->next; if(m == cur->value) { node[k].next = cur->next; cur->next = &node[k]; break; } } } k++; } // 删除对应的节点 scanf("%d", &m); if(m == head->value) { head = head->next; } else { cur = head; while(1) { if(m == cur->next->value) { cur->next = cur->next->next; break; } cur = cur->next; } } cur = head; while(cur) { printf("%d ", cur->value); cur = cur->next; } }
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int N, x, y, z, m, n, p; //x第一个;y,z连续接收两个;m遍历数组的序号;n为删除节点 scanf("%d", &N); int a[N]; scanf("%d", &x); a[0] = x; int length = 1; for (int i = 0; i < N - 1; i++) { scanf("%d %d ", &y, &z); for (m = 0; m < length; m++) { if (a[m] == y) { for (int o = length; o > m; o--) { a[o] = a[o - 1]; } a[m] = z; length++; break; } else if (a[m] == z) { for (int o = length; o > m + 1; o--) { a[o] = a[o - 1]; } a[m + 1] = y; length++; break; } } } scanf("%d", &n); for (int i = 0; i < length - 1; i++) { if (a[length - 1] == n) { length --; break; } else if (a[i] == n) { for (; i < length; i++) a[i] = a[i + 1]; length--; break; } } for (p = 0; p < length; p++) printf("%d ", a[p]); }
#include <stdio.h> #include <stdlib.h> typedef struct list { int num; struct list *next; }list; int main() { int cnt,del,i,j; list *p0=malloc(sizeof(list)),*p1,*p2; scanf("%d%d",&cnt,&p0->num); p0->next=NULL; cnt--; while(cnt>0) { scanf("%d%d",&i,&j); p1=p0; while(p1!=NULL) { if(p1->num==j) { p2=malloc(sizeof(list)); p2->num=i; p2->next=p1->next; p1->next=p2; break; } p1=p1->next; } cnt--; } scanf("%d",&del); p1=p0; p2=p0->next; if(p1->num==del) p0=p0->next; else { while(p2!=NULL) { if(p2->num==del) { p1->next=p2->next; break; } p1=p2; p2=p2->next; } } p1=p0; while(p1!=NULL) { printf("%d ",p1->num); p1=p1->next; } return 0; }
#include <stdio.h> #include <stdlib.h> #define max_array 10000 typedef struct node { int data; struct node *prev; struct node *next; }node; int d; node *delete_node(node *head,int del); int main() { int num = 0; scanf("%d",&num); int a[max_array]={0}; int i = 0; for(i=0; i < num*2;i++) { scanf("%d",&a[i]); }//a[0] is head,a[num*2 -1] is delete; for(i=0;i < num*2;i++) { //printf ("%d ",a[i]); } node *head = malloc(sizeof(node)); head->data = a[0]; head->next = NULL; head->prev = NULL; //printf("head->data == %d\n",head->data); int bfn = 0; for(i =1 ; i< num*2 -1;i+=2) { //printf("i == %d\n",i); node *n = malloc(sizeof(node)); n->data = 0; n->next = NULL; n->prev = NULL; n->data = a[i]; //printf("n->data == %d\n",n->data); bfn = a[i+1]; //printf("bfn == %d\n",bfn); if(head->data == bfn) { //printf("head->data == bfn\n"); if(head ->next ==NULL) { head->next = n; n->prev = head; continue; } else { //printf("!!!!!!!!n->data = %d\n",n->data); //n->next = head->next; //printf("these head->next == %d\n",head->next->data); //should be 1 node *linshi =head->next; n->next =linshi; n->prev =head; //printf("these linshi->data %d\n",linshi->data); linshi ->prev = n; head->next = n; //printf("n->next->data =%d\n",n->next->data); //printf("n->prev->data = %d\n",n->prev->data); //printf("n->prev->next->data = %d\n",n->prev->next->data); //printf("n->next->prev->data = %d\n",n->prev->next->data); continue; }//end of if(head ->next ==NULL) }//end of if(head->data == bfn) node *search =head->next; // printf("search->data == %d\n",search->data); // printf("before while bfn == %d\n",bfn); while(1) { // printf("while here!!\n"); // printf("while here!! search->data ==%d\n",search->data); // printf("while bfn == %d\n",bfn); if(bfn == search->data) { if(search->next) { n->next =search->next; search->next->prev =n; } search->next = n; n->prev=search; break; } if(search->next !=NULL) { // printf("in while before search->data ==%d\n",search->data); search = search->next; // printf("in while after search->data ==%d\n",search->data); } else { //printf("invalid before node num!\n"); return 0; } }//end of while(1) }//end offor(i =1 ; i< num*2 -1;i+=2) node *prin = head; while(1) { //printf("%d ",prin->data); if(prin->next != NULL) { prin = prin->next; } else { // printf("\n"); break; } } d = a[num *2 -1]; //the delete node->data //delete_node(head,d); //printf("d == %d\n",d); prin = delete_node(head,d); //printf("niubi\n"); while(1) { printf("%d ",prin->data); if(prin->next != NULL) { prin = prin->next; } else { //printf("\n"); break; } } } node *delete_node(node *head,int del) { node *delete = head; node *tmp = delete; //printf("delete == tmp ==%d\n",delete->data); while(1) { if(delete->data == d) { //printf("1111111\n"); if(delete->prev && delete->next) { // printf("22222222\n"); tmp = delete->next; delete->prev->next = delete->next; delete->next->prev = delete->prev; free(delete); delete =tmp; continue; } else if(delete->prev == NULL && delete->next != NULL) { //printf("333333333\n"); tmp = delete->next; delete->next->prev =NULL; free(delete); delete =tmp; } } if(delete -> next) { //printf("44444444\n"); delete = delete->next; } else { while(1) { // printf("555555555\n"); if(delete->prev) { //printf("666666666\n"); delete = delete->prev; } else { break; } } //printf("7777777\n"); return delete; } } }
#include int main() { //Input number of points & value of first number int num; int fir; scanf("%d %d",&num,&fir); int sum[1000]={0}; sum[0]=fir; //Input two numbers per time int i=1; while(i<num)//Times of while loop { int n1=0,n2=0; scanf("%d %d",&n1,&n2); //Detect points and input new points for(int j=0; j<num; j++) { if(sum[j]==n2) { //Detect whether there is a value if(sum[j+1]==0) { sum[j+1]=n1;//If not, input new points } else { for(int k=i; k>j+1; k--) { sum[k]=sum[k-1];//If there is, move all point back for one place } sum[j+1]=n1; } } } i++; } //Delete value of late number in string int del; scanf("%d", &del); for(int i=0; i<num; i++) { if(sum[i]==del) { for(int j=i; j<num; j++) { sum[j]=sum[j+1];//If there is a deleted point, all points behind it should move toward for one place } num--;//And number of string should minus one } } //Output the final string for(int i=0; i<num; i++) { printf("%d ",sum[i]); } }
#include <stdio.h> #include <stdlib.h> typedef struct node{ int num; struct node* next; }Node; Node *createnode(int num); void addnode(int num1,int num2,Node *head); Node *deletenode(int num,Node *head); void printlist(Node *head); void myfunc(int index,int headnum); int main(void) { int index,headnum; while(scanf("%d %d",&index,&headnum) == 2){ myfunc(index,headnum); } return 0; } Node *createnode(int num) { Node *pt; pt = (Node*)malloc(sizeof(Node)); pt->num = num; pt->next = NULL; return pt; } void addnode(int num1,int num2,Node *head) { Node *now,*add; now = head; while(now->num != num2) now = now->next; //找到num2 add = createnode(num1); add->next = now->next; now->next = add; } Node *deletenode(int num,Node *head) { Node *now,*pre; now = head,pre = head; while(now->num != num){ pre = now; now = now->next; //找到num } if(now == head){ head = head->next; //如果删除的是头部节点 }else{ pre->next = now->next; } free(now); return head; //删除节点有可能改变头节点的位置,所以要返回头节点 } void printlist(Node *head) { Node * now; for(now = head;head != NULL;head = now){ printf("%d ",head->num); now = head->next; free(head); } printf("\n"); } void myfunc(int index,int headnum) { int num,add; int i; Node *head = createnode(headnum); for(i=0;i<index-1;i++){ scanf("%d %d",&add,&num); addnode(add, num, head); } scanf("%d",&num); head = deletenode(num,head); printlist(head); }
#include <stdio.h> #define maxsize 700 void insert(int position, int num, int *p, int size) { for(int i = 0; i < size; i++) { if(*(p + i) == position) { for(int j = size - 1; j > i; j--) { *(p + j + 1) = *(p + j); } *(p + i + 1) = num; } } } void deletenum(int position, int *p, int size) { for(int i = 0; i < size + 1; i++) { if(*(p + i) == position) { for(int j = i; j < size + 1; j++) { *(p + j) = *(p + j + 1); } } } } int main() { int num = 0; int input[maxsize]; int head = 0; int next = 0; int delete = 0; int position = 0; while(scanf("%d", &num) != EOF) { head = 0; delete = 0; next = 0; position = 0; for(int i = 0; i < maxsize; i++) input[i] = 0; scanf("%d", &head); input[0] = head; for(int i = 0; i < num - 1; i++) { scanf("%d", &next); scanf("%d", &position); insert(position, next, input, num); } scanf("%d", &delete); deletenum(delete, input, num); for(int i = 0; i < num - 1; i++) { printf("%d ", input[i]); } printf("\n"); } } 没有用到链表,用数组顺序做链表
#include<stdio.h> int main() { int in[5000] = {0}; int num = 0; while(scanf("%d ", &in[num]) != EOF) { num++; } typedef struct lian { int value; struct LIAN *next; }LIAN; LIAN *head, *normal; // 创建第一个节点 head = (LIAN*)malloc(sizeof(LIAN)); head->value = in[1]; // 创建第二个节点 normal = (LIAN*)malloc(sizeof(LIAN)); normal->value = in[2]; normal->next = NULL; head->next = normal; LIAN *p = head; // 创建后续的节点 for (int i = 4; i < num-2; i=i+2) { p = head; while(p != NULL) { if(p->value == in[i+1]) { LIAN *temp = p->next; normal = (LIAN*)malloc(sizeof(LIAN)); normal->value = in[i]; p->next = normal; normal->next = temp; break; } else { p = p->next; } } } // 删除节点 p = head; while(p->next != NULL) { LIAN *temp = p->next; if(temp->value == in[num-1]) { p->next = temp->next; break; } p = p->next; } // 输出链表 p = head; while(p->next != NULL) { printf("%d ", p->value); p = p->next; } printf("%d", p->value); }
#include <stdio.h> #include <string.h> typedef struct node { int _data; struct node* _next; }Node; //创建头结点 Node* creatHeadNode(int data) { Node* head = (Node*)malloc(sizeof(Node)); head->_data = data; head->_next = NULL; return head; } //插入节点 Node* insertNode(Node* head, int data, Node* tmp) { Node* cur = (Node*)malloc(sizeof(Node)); cur->_data = data; cur->_next = tmp->_next; tmp->_next = cur; return head; } //删除节点 Node* deletNode(Node* head, int data) { Node* tmp; if(head->_data == data) { tmp = head->_next; free(head); return tmp; } else { tmp = head; while(tmp->_next->_data != data) tmp = tmp->_next; Node* cur = tmp->_next; tmp->_next = cur->_next; free(cur); return head; } } //查找 Node* searchNode(Node* head, int find) { Node* tmp = head; while(tmp->_data != find) tmp = tmp->_next; return tmp; } int main() { int arr[2000]; int n; scanf("%d", &n); arr[0] = n; int len = (n-1)*2+3; for(int i=1;i<len; i++) scanf("%d", &(arr[i])); Node* head = creatHeadNode(arr[1]); for(int i=2; i<len-1; i+=2) { Node* cur = searchNode(head, arr[i+1]); insertNode(head, arr[i], cur); } deletNode(head, arr[len-1]); int th = (len-3)/2; Node* tmp = head; for(int i=0; i<th; i++) { printf("%d ", tmp->_data); tmp = tmp->_next; } return 0; }