2-4 递增链表的插入

简介: 2-4 递增链表的插入

题目链接:https://pintia.cn/problem-sets/434/problems/5726

1.如果题目没有给我们建好原递增序列的链表,那么我们可以考虑在创建原链表时插入需要插入的结点,就是在创建原链表时,每读入一个数据,将该数据与待插入的数据相比较,如果发现待插入数据小于等于刚读入的数据,那么就先把需要插入的数据生成的结点链接到表尾,再把刚读入的数据结点链接到表尾,然后继续链表的创建,但是为了防止需要插入数据的反复插入,我们需要设置一个标志flag = 0; 插入完成后就将这个flag置为1,这样就不会反复插入了。

下面是这个想法的实现代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef int ElementType;
 5 typedef struct Node* List;
 6 struct Node{
 7     ElementType Data;
 8     List Next;
 9 };
10 
11 int main()
12 {
13     int N, M, dt, flag;
14     flag = 0;
15     List front, rear, tmp;
16     front = rear = (List)malloc(sizeof(struct Node));
17 
18     scanf_s("%d %d", &N, &M);
19     getchar();
20 
21     if (N == 0)                //如果原链表为空,直接插入
22     {
23         tmp = (List)malloc(sizeof(struct Node));
24         tmp->Data = M;
25         tmp->Next = NULL;
26         rear->Next = tmp;
27         rear = tmp;
28     }
29 
30     while (N--)            //如果原链表不为空,在建表时插入
31     {
32         scanf_s("%d", &dt);
33         getchar();
34         if (M <= dt && flag == 0)
35         {
36             flag = 1;
37             tmp = (List)malloc(sizeof(struct Node));
38             tmp->Data = M;
39             tmp->Next = NULL;
40             rear->Next = tmp;
41             rear = tmp;
42         }
43         tmp = (List)malloc(sizeof(struct Node));
44         tmp ->Data = dt;
45         tmp -> Next = NULL;
46         rear -> Next = tmp;
47         rear = tmp;
48     }
49     tmp = front -> Next;
50     for (;tmp->Next; tmp = tmp->Next)
51         printf("%d ", tmp->Data);
52     printf("%d\n", tmp->Data);
53     
54 
55     return 0;
56 }

2.下面是这题的常规解法:

 1 List Insert(List L, ElementType X)
 2 {
 3     List PreNode, InsNode;
 4     PreNode = L;
 5     for (; PreNode->Next && PreNode->Next->Data < X; PreNode = PreNode->Next);
 6     InsNode = (List)malloc(sizeof(struct Node));
 7     InsNode->Data = X;
 8     InsNode->Next = PreNode->Next;
 9     PreNode->Next = InsNode;
10     return L;
11 }


相关文章
|
7月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
104 0
Go语言time库,时间和日期相关的操作方法
|
7月前
|
Python Java Go
Python每日一练(20230428) 最长有效括号、矩阵最长递增路径、回文链表
Python每日一练(20230428) 最长有效括号、矩阵最长递增路径、回文链表
62 0
Python每日一练(20230428) 最长有效括号、矩阵最长递增路径、回文链表
|
测试技术
5.输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
86 0
|
7月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
65 2
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
60 1
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
6月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】