1.一个以递增方式排列的链表,去掉链表中的冗余值。

思路一:设有两个指针p和q。使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除。

思路二:设有两个指针p和q,使p在前,q在后,仅仅要找到一个冗余就删除一个,依次往后删除。

输入的链表:1 3 3 3 3 6 6 8 9 10

删除后的链表:1 3 6 8 9 10

比較两种思路。思路二的想法相比于思路一要好。所以这里实现思路二的代码。

2.将一个结点插入到一个有序的链表中。

思路:首先要判定这个链表是递增排列的链表还是递减排列的链表。然后相相应的查找这个结点须要插入的位置。对于递增链表来说,须要查找到第一个节点值大于等于要插入的结点,然后将须要插入的结点插入到该结点前面;对于递减链表来说,须要查找到第一个小于等于要插入的结点。然后将须要插入的结点插入到该结点前面。须要考虑的特殊情况是插入的结点可能会插入在第一个位置。

  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. #define NULL 0
  5.  
  6. typedef struct node {
  7. int data;
  8. struct node *next;
  9. }ElemSN;
  10.  
  11. ElemSN * creat_link(int ms); //逆向创建一个链表
  12. void print_link(ElemSN *head); //输出单向链表
  13. void delete_rdy(ElemSN *head); //删除冗余的项
  14. ElemSN * insert_node(ElemSN *head, int x); //插入结点到有序链表
  15. ElemSN * clear_link(ElemSN *head); //删除链表
  16.  
  17. int main()
  18. {
  19. ElemSN *head;
  20. int ms, x;
  21.  
  22. printf("Please input node number:");
  23. scanf("%d", &ms);
  24. head = creat_link(ms); //创建链表
  25. print_link(head);
  26. delete_rdy(head);
  27. print_link(head);
  28. head = insert_node(head, 5);
  29. print_link(head);
  30. head = clear_link(head); //删除链表
  31. }
  32.  
  33. ElemSN * creat_link(int ms)
  34. {
  35. ElemSN *h = NULL, *p;
  36. int i, x;
  37.  
  38. for(i = 0; i < ms; i++)
  39. {
  40. printf("Please input data:");
  41. scanf("%d", &x);
  42. p = (ElemSN *)malloc(sizeof(ElemSN));
  43. p->data = x;
  44. p->next = h;
  45. h = p;
  46. }
  47.  
  48. return h;
  49. }
  50.  
  51. void print_link(ElemSN *head)
  52. {
  53. for(; head; head = head->next)
  54. {
  55. printf("%d ", head->data);
  56. }
  57. printf("\n");
  58. }
  59.  
  60. void delete_rdy(ElemSN *head)
  61. {
  62. ElemSN *p, *q;
  63.  
  64. if(NULL == head)
  65. return;
  66. p = head;
  67. q = p->next;
  68. while(q)
  69. {
  70. if(p->data == q->data)
  71. {
  72. p->next = q->next;
  73. free(q);
  74. q = p->next;
  75. }
  76. else
  77. {
  78. p = q;
  79. q = p->next;
  80. }
  81. }
  82. }
  83.  
  84. ElemSN * insert_node(ElemSN *head, int x)
  85. {
  86. ElemSN *p, *q;
  87.  
  88. if(NULL == head || NULL == head->next)
  89. return NULL;
  90. p = head;
  91. q = head; //这里不能赋值为head->next,比較必须从第一个结点開始
  92. if(q->data >= q->next->data) //递减链表
  93. {
  94. for(; q && q->data >= x; p = q, q = q->next){}
  95. }
  96. else //递增链表
  97. {
  98. for(; q && q->data <= x; p = q, q = q->next){}
  99. }
  100.  
  101. if(NULL == q) //插入在链表尾部
  102. {
  103. q = (ElemSN *)malloc(sizeof(ElemSN));
  104. q->data = x;
  105. q->next = NULL;
  106. p->next = q;
  107. }
  108. else if(q == head) //插入在表首
  109. {
  110. q = (ElemSN *)malloc(sizeof(ElemSN));
  111. q->data = x;
  112. q->next = head;
  113. head = q;
  114. }
  115. else //插入在中间位置
  116. {
  117. p->next = (ElemSN *)malloc(sizeof(ElemSN));
  118. p->next->next = q;
  119. p->next->data = x;
  120. }
  121.  
  122. return head;
  123. }
  124.  
  125. ElemSN * clear_link(ElemSN *head)
  126. {
  127. ElemSN *p;
  128.  
  129. while(head)
  130. {
  131. p = head->next;
  132. free(head);
  133. head = p;
  134. }
  135.  
  136. return head;
  137. }

链表(三)——链表删除冗余结点&amp;插入结点到有序链表的更多相关文章

  1. 单链表创建、删除、查找、插入之C语言实现

    本文将详细的介绍C语言单链表的创建.删除.查找.插入以及输出功能 一.创建 #include<stdio.h> #include<stdlib.h> typedef int E ...

  2. 打印两个有序链表的公共部分 【题目】 给定两个有序链表的头指针head1和head2,打印两个 链表的公共部分

    简单题 package my_basic.class_3; public class Code_10_PrintCommonPart { public static class Node{ int v ...

  3. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  4. Java 实现有序链表

    有序链表: 按关键值排序. 删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时须要比較O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 假设一个应用须 ...

  5. [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  6. 在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  7. C语言实现单链表的遍历,逆序,插入,删除

    单链表的遍历,逆序,插入,删除 #include<stdio.h> #include<stdlib.h> #include <string.h> #define b ...

  8. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  9. [LeetCode] Insert into a Cyclic Sorted List 在循环有序的链表中插入结点

    Given a node from a cyclic linked list which is sorted in ascending order, write a function to inser ...

随机推荐

  1. Spark MLlib协同过滤算法

    算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...

  2. 为root账户更名

    为root账户更名 处于安全考虑许多管理员想把root更名,具体方法如下: 1.先以root登陆系统 2.用vi 编辑/etc/passwd文件,将第一行的第一个root修改为你想要的账户名,然后保存 ...

  3. 跟我一起造轮子 手写springmvc

    原创地址:https://www.cnblogs.com/xrog/p/9820168.html 作为java程序员,项目中使用到的主流框架多多少少和spring有关联,在面试的过程难免会问一些spr ...

  4. 004 python 流程控制语句

    流程控制语句 1.if判断 语法 a = 10,b = 20# 1if a == 10:  print('a等于10')# 2if a > b:  print('a大于b')else:  pri ...

  5. 【Codeforces Round #457 (Div. 2) C】Jamie and Interesting Graph

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找比n-1大的最小的素数x 1-2,2-3..(n-2)-(n-1)长度都为1 然后(n-1)-n长度为(x-(n-2)) 然后其他 ...

  6. Chormium线程模型及应用指南

    核心概念 设计上遵循以下原则: 1 不要在UI线程做不论什么堵塞式的I/O操作,以及其他耗时的操作,通过消息传递把各种操作传给相应用途的线程去做. 2 不鼓舞线程加锁机制和线程安全对象. 对象仅仅存在 ...

  7. lubuntu自动登录(lxde)

    lubuntu自动登录(lxde) 1.重启ubuntu,在grub界面长按shirft进入grub菜单: 2.选择recovery mode,按"e"键进入编辑页面: 3.把ro ...

  8. 36.Node.js 工具模块--OS模块系统操作

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模 ...

  9. JavaFx lineChart real-time Monitor

    JavaFx lineChart real-time Monitor   about memory public class EffectTest extends Application { Stac ...

  10. menuconfig_kconfig

    这一节的主要内容: Menuconfig的操作 Kconfig和.config文件 Linux内核配置裁剪实验 linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉 menuco ...