目录
- 前言
- 1.单向链表
- 2.链表交换
- 3.单链表求和
- 4.双链表求和
- 5.链表删除
- 6.链表添加结点
- 7.反转链表
前言
题目来源于 https://www.nowcoder.com/exam/oj?page=1
1.单向链表
描述
从键盘输入一个长度为 n 的数组,问你能否用这个数组组成一个链表,并顺序输出链表每个节点的值。
输入描述
第一行输入一个正整数 n ,表示数组的长度
输出描述
制作一个链表然后输出这个链表的值
示例
题解
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;
Node *create_list()
{
Node *head_Node = (Node*)malloc(sizeof(Node));
head_Node->next = NULL;
return head_Node;
}
Node *create_node(int data)
{
Node *new_Node = (Node*)malloc(sizeof(Node));
new_Node->data = data;
new_Node->next = NULL;
return new_Node;
}
void print_list(Node *head_Node)
{
Node *pMove = head_Node->next;
while(pMove)
{
printf("%d ",pMove->data);
pMove = pMove->next;
}
}
void insert_Node_by_Head(Node *headNode,int data)
{
Node *new_Node = create_node(data);
new_Node->next = headNode->next;
headNode->next = new_Node;
}
void insert_Node_by_Tail(Node *headNode, int data)
{
Node *new_Node = create_node(data);
Node *test_Node = NULL;
for(test_Node = headNode; test_Node->next != NULL ; test_Node = test_Node->next);
test_Node->next = new_Node;
}
int main()
{
int n;
int a[100];
Node *list = create_list();
while((scanf("%d", &n) != EOF))
{
for(int i = 0 ; i < n ; i++)
{
scanf("%d", &a[i]);
insert_Node_by_Tail(list, a[i]);
}
print_list(list);
}
return 0;
}
2.链表交换
描述
尝试把一个长度为 n 的数组转换成链表并把链表前两个节点交换位置和把链表最后两个节点交换位置。
输入描述
第一行输入一个正整数 n 表示数组的长度
第二行输入 n 个正整数,表示数组中各个元素的值
输出描述
把数组转换成链表后输出交换位置后的链表
示例
题解
#include <stdio.h>
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* create_list()
{
Node* head_node = (Node*)malloc(sizeof(Node));
head_node->next = NULL;
return head_node;
}
Node* create_node(int data)
{
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_by_tail(Node* head_node,int data)
{
Node* new_node = create_node(data);
Node* test = NULL;
for(test = head_node;test->next!=NULL;test = test->next);
test->next = new_node;
}
void print_list(Node* head_node)
{
Node* ptr = head_node->next;
while(ptr)
{
printf("%d ",ptr->data);
ptr = ptr->next;
}
}
void change(Node* head_node)
{
int tmp1 = 0;
tmp1 = head_node->next->next->data;
head_node->next->next->data = head_node->next->data;
head_node->next->data = tmp1;
int tmp2 = 0;
Node* ptrtest = head_node;
while(ptrtest->next->next)
{
ptrtest = ptrtest->next;
}
tmp2 = ptrtest->next->data;
ptrtest->next->data = ptrtest->data;
ptrtest->data = tmp2;
}
int main()
{
int n;
int arr[100];
Node* List = create_list();
while(scanf("%d",&n)!=EOF)
{
for(int i = 0;i < n;i++)
{
scanf("%d",&arr[i]);
insert_by_tail(List,arr[i]);
}
change(List);
print_list(List);
}
return 0;
}
3.单链表求和
描述
输入一个长度为 n 的数组,他想把这个数组转换成链表,链表上每个节点的值对应数组中一个元素的值,然后遍历链表并求和各节点的值。
输入描述
第一行输入一个正整数 n ,表示数组的长度。
第二行输入 n 个正整数,表示数组中各个元素的值。
输出描述:
把数组转换成链表然后对其求和并输出这个值。
示例
题解
#include <math.h>
#include <stdio.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
Node* create_list()
{
Node* head_node = (Node*)malloc(sizeof(Node));
head_node->next = NULL;
return head_node;
}
Node* create_node(int data)
{
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_by_tail(Node* head_node,int data)
{
Node* new_node = create_node(data);
Node* ptrtest = (Node*)malloc(sizeof(Node));
for(ptrtest = head_node;ptrtest->next!=NULL;ptrtest=ptrtest->next);
ptrtest->next = new_node;
}
int main()
{
int n;
int arr[10];
Node* List = create_list();
while(scanf("%d",&n)!=EOF)
{
for(int i = 0;i < n;i++)
{
scanf("%d",&arr[i]);
insert_by_tail(List, arr[i]);
}
}
int sum = 0;
Node* ptr = List;
while(ptr)
{
sum = sum + ptr->data;
ptr = ptr->next;
}
printf("%d",sum);
free(ptr);
ptr = NULL;
free(List);
return 0;
}
4.双链表求和
描述
输入两个长度相同的数组分别是 a 和 b ,然后把数组 a 和 b 转换成链表 a 和链表 b 。把链表 a 中的全部值按顺序加到链表 b 中。
输入描述
第一行输入一个正整数 n ,表示数组的长度。
第二行和第三行分别输入 n 个正整数,表示数组 a 和 数组 b 的值。
输出描述
把数组 a 和数组 b 转换成链表,然后把链表 a 中的值加到链表 b 中,然后输出加和后的链表。
示例
-
输入
5
5 4 2 1 3
2 4 5 8 9
-
输出
7 8 7 9 12
题解
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
Node* create_list()
{
Node* head_node = (Node*)malloc(sizeof(Node));
head_node->next = NULL;
return head_node;
}
Node* create_new_node(int data)
{
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_by_tail(Node* head_node,int data)
{
Node* new_node = create_new_node(data);
Node* ptr = NULL;
for(ptr = head_node;ptr->next != NULL;ptr = ptr->next);
ptr->next = new_node;
}
void list_sum(Node* head_node1,Node* head_node2,int* arr3)
{
Node* test1 = head_node1->next;
Node* test2 = head_node2->next;
int i = 0;
while(test1 && test2)
{
arr3[i] = test1->data + test2->data;
test1 = test1->next;
test2 = test2->next;
i++;
}
}
int main()
{
int n;
scanf("%d",&n);
int arr1[n];
int arr2[n];
Node* A = create_list();
Node* B = create_list();
for(int i = 0;i < n;i++)
{
scanf("%d",&arr1[i]);
insert_by_tail(A, arr1[i]);
}
for(int i = 0;i < n;i++)
{
scanf("%d",&arr2[i]);
insert_by_tail(B, arr2[i]);
}
int arr3[n];
Node* C = create_list();
list_sum(A, B, arr3);
for (int i = 0;i < n;i++)
{
insert_by_tail(C, arr3[i]);
}
Node* printptr = (Node*)malloc(sizeof(Node));
for(printptr = C->next;printptr!=NULL;printptr = printptr->next)
{
printf("%d ",printptr->data);
}
return 0;
}
5.链表删除
描述
牛牛从键盘输入了一个长度为 n 的数组,把这个数组转换成链表然后把链表中所有值是 x 的节点都删除。
输入描述
第一行输入两个正整数 n 和 x 表示数组的长度和要删除的链表节点值 x 。
第二行输入 n 个正整数表示数组中每个元素的值。
输出描述
把数组转换成链表然后删除所有值是 x 的节点,删除后输出这个链表。
示例
题解
#include <malloc.h>
#include <stdio.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
Node* create_list()
{
Node* head_node = (Node*)malloc(sizeof(Node));
head_node->next = NULL;
return head_node;
}
Node* create_node(int data)
{
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_by_tail(Node* head_node,int data)
{
Node* ptr = NULL;
Node* new_node = create_node(data);
for(ptr = head_node;ptr->next!=NULL;ptr=ptr->next);
ptr->next = new_node;
}
void delete(Node* head_node,int x)
{
Node* test = head_node;
while(test->next != NULL)
{
if(test->next->data == x)
{
test->next = test->next->next;
}
test = test->next;
}
}
void print_list(Node* head_node)
{
Node* printptr = head_node->next;
while(printptr != NULL)
{
printf("%d ",printptr->data);
printptr = printptr->next;
}
}
int main()
{
int n = 0;
scanf("%d",&n);
int x = 0;
scanf("%d",&x);
Node* L = create_list();
int arr[n];
for (int i = 0;i < n;i++)
{
scanf("%d",&arr[i]);
insert_by_tail(L, arr[i]);
}
delete(L, x);
print_list(L);
return 0;
}
6.链表添加结点
描述
输入一个长度为 n 的数组,他把这个数组转换成链表并在第 i 个节点的后面添加一个值为 i 的新节点
输入描述
第一行输入两个正整数分别是 n 和 i ,表示数组的长度、需要添加节点的位置和节点的值
第二行输入 n 个正整数表示数组中每个元素的值
输出描述
把数组转换成链表并在第 i 个节点后的添加一个新节点值,新节点的值是 i
示例
-
输入
5 3
5 4 8 6 3
-
输出
5 4 8 3 6 3
题解
#include <stdio.h>
#include <string.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
Node* create_list()
{
Node* head_node = (Node*)malloc(sizeof(Node));
head_node->next = NULL;
return head_node;
}
Node* create_new_node(int data)
{
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->next = NULL;
return new_node;
}
void insert_by_tail(Node* head_node,int data)
{
Node* new_node = create_new_node(data);
Node* ptr = NULL;
for(ptr = head_node;ptr->next!=NULL;ptr = ptr->next);
ptr->next = new_node;
}
void print_list(Node* head_node)
{
Node* test = head_node->next;
while(test)
{
printf("%d ",test->data);
test = test->next;
}
}
void insert(Node* head_node,int i)
{
Node* in_node = create_new_node(i);
Node* inptr = head_node;
while(i)
{
inptr = inptr->next;
i--;
}
in_node->next = inptr->next;
inptr->next = in_node;
}
int main()
{
int n = 0;
scanf("%d",&n);
int arr[n];
int i = 0;
scanf("%d",&i);
Node* L = create_list();
for(int j = 0;j < n;j++)
{
scanf("%d",&arr[i]);
insert_by_tail(L,arr[i]);
}
insert(L, i);
print_list(L);
return 0;
}
7.反转链表
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)