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 }

 

上一篇:C语言实现链队列


下一篇:将两个多项式相加