链表(三)——链表删除冗余结点&插入结点到有序链表
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.将一个结点插入到一个有序的链表中。
思路:首先要判定这个链表是递增排列的链表还是递减排列的链表。然后相相应的查找这个结点须要插入的位置。对于递增链表来说,须要查找到第一个节点值大于等于要插入的结点,然后将须要插入的结点插入到该结点前面;对于递减链表来说,须要查找到第一个小于等于要插入的结点。然后将须要插入的结点插入到该结点前面。须要考虑的特殊情况是插入的结点可能会插入在第一个位置。
- #include <stdio.h>
- #include <malloc.h>
- #define NULL 0
- typedef struct node {
- int data;
- struct node *next;
- }ElemSN;
- ElemSN * creat_link(int ms); //逆向创建一个链表
- void print_link(ElemSN *head); //输出单向链表
- void delete_rdy(ElemSN *head); //删除冗余的项
- ElemSN * insert_node(ElemSN *head, int x); //插入结点到有序链表
- ElemSN * clear_link(ElemSN *head); //删除链表
- int main()
- {
- ElemSN *head;
- int ms, x;
- printf("Please input node number:");
- scanf("%d", &ms);
- head = creat_link(ms); //创建链表
- print_link(head);
- delete_rdy(head);
- print_link(head);
- head = insert_node(head, 5);
- print_link(head);
- head = clear_link(head); //删除链表
- }
- ElemSN * creat_link(int ms)
- {
- ElemSN *h = NULL, *p;
- int i, x;
- for(i = 0; i < ms; i++)
- {
- printf("Please input data:");
- scanf("%d", &x);
- p = (ElemSN *)malloc(sizeof(ElemSN));
- p->data = x;
- p->next = h;
- h = p;
- }
- return h;
- }
- void print_link(ElemSN *head)
- {
- for(; head; head = head->next)
- {
- printf("%d ", head->data);
- }
- printf("\n");
- }
- void delete_rdy(ElemSN *head)
- {
- ElemSN *p, *q;
- if(NULL == head)
- return;
- p = head;
- q = p->next;
- while(q)
- {
- if(p->data == q->data)
- {
- p->next = q->next;
- free(q);
- q = p->next;
- }
- else
- {
- p = q;
- q = p->next;
- }
- }
- }
- ElemSN * insert_node(ElemSN *head, int x)
- {
- ElemSN *p, *q;
- if(NULL == head || NULL == head->next)
- return NULL;
- p = head;
- q = head; //这里不能赋值为head->next,比較必须从第一个结点開始
- if(q->data >= q->next->data) //递减链表
- {
- for(; q && q->data >= x; p = q, q = q->next){}
- }
- else //递增链表
- {
- for(; q && q->data <= x; p = q, q = q->next){}
- }
- if(NULL == q) //插入在链表尾部
- {
- q = (ElemSN *)malloc(sizeof(ElemSN));
- q->data = x;
- q->next = NULL;
- p->next = q;
- }
- else if(q == head) //插入在表首
- {
- q = (ElemSN *)malloc(sizeof(ElemSN));
- q->data = x;
- q->next = head;
- head = q;
- }
- else //插入在中间位置
- {
- p->next = (ElemSN *)malloc(sizeof(ElemSN));
- p->next->next = q;
- p->next->data = x;
- }
- return head;
- }
- ElemSN * clear_link(ElemSN *head)
- {
- ElemSN *p;
- while(head)
- {
- p = head->next;
- free(head);
- head = p;
- }
- return head;
- }
链表(三)——链表删除冗余结点&插入结点到有序链表的更多相关文章
- 单链表创建、删除、查找、插入之C语言实现
本文将详细的介绍C语言单链表的创建.删除.查找.插入以及输出功能 一.创建 #include<stdio.h> #include<stdlib.h> typedef int E ...
- 打印两个有序链表的公共部分 【题目】 给定两个有序链表的头指针head1和head2,打印两个 链表的公共部分
简单题 package my_basic.class_3; public class Code_10_PrintCommonPart { public static class Node{ int v ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- Java 实现有序链表
有序链表: 按关键值排序. 删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时须要比較O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 假设一个应用须 ...
- [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 ...
- 在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- C语言实现单链表的遍历,逆序,插入,删除
单链表的遍历,逆序,插入,删除 #include<stdio.h> #include<stdlib.h> #include <string.h> #define b ...
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- [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 ...
随机推荐
- Spark MLlib协同过滤算法
算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...
- 为root账户更名
为root账户更名 处于安全考虑许多管理员想把root更名,具体方法如下: 1.先以root登陆系统 2.用vi 编辑/etc/passwd文件,将第一行的第一个root修改为你想要的账户名,然后保存 ...
- 跟我一起造轮子 手写springmvc
原创地址:https://www.cnblogs.com/xrog/p/9820168.html 作为java程序员,项目中使用到的主流框架多多少少和spring有关联,在面试的过程难免会问一些spr ...
- 004 python 流程控制语句
流程控制语句 1.if判断 语法 a = 10,b = 20# 1if a == 10: print('a等于10')# 2if a > b: print('a大于b')else: pri ...
- 【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)) 然后其他 ...
- Chormium线程模型及应用指南
核心概念 设计上遵循以下原则: 1 不要在UI线程做不论什么堵塞式的I/O操作,以及其他耗时的操作,通过消息传递把各种操作传给相应用途的线程去做. 2 不鼓舞线程加锁机制和线程安全对象. 对象仅仅存在 ...
- lubuntu自动登录(lxde)
lubuntu自动登录(lxde) 1.重启ubuntu,在grub界面长按shirft进入grub菜单: 2.选择recovery mode,按"e"键进入编辑页面: 3.把ro ...
- 36.Node.js 工具模块--OS模块系统操作
转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模 ...
- JavaFx lineChart real-time Monitor
JavaFx lineChart real-time Monitor about memory public class EffectTest extends Application { Stac ...
- menuconfig_kconfig
这一节的主要内容: Menuconfig的操作 Kconfig和.config文件 Linux内核配置裁剪实验 linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉 menuco ...