在一行上:
先输入一个整数
代表链表中节点的总数;
随后输入一个整数
代表头节点的值;
随后输入
个二元组
;
最后输入一个整数
,代表需要删除的节点值。
除此之外,保证每一个
值在输入前已经存在于链表中;每一个
值在输入前均不存在于链表中。节点的值各不相同。
在一行上输出
个整数,代表删除指定元素后剩余的链表。
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;
}