链表(三)——链表删除冗余结点&插入结点到有序链表
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 ...
随机推荐
- Vectorized implementation
Vectorization Vectorization refers to a powerful way to speed up your algorithms. Numerical computin ...
- ActiveMQ学习总结(7)——ActiveMQ使用场景
MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传 ...
- 《Java设计模式》之桥接模式
Bridge模式的概念 Bridge 模式是构造型的设计模式之中的一个.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abst ...
- heap-adb shell查看堆栈使用
今天在使用eclipse中的heap查看oom的时候,发现手机(eng版本)非常的卡,后来换成usr版本,又连接不上eclipse.最后听别人说,可以使用adb shell进行查看.指令如下 adb ...
- 字符设备驱动-------Linux异常处理体系结构
裸机中断流程 外部触发 CPU 发生中断, 强制的跳到异常向量处 跳转到具体函数 保存被中断处的现场(各种寄存器的值) 执行中断处理函数,处理具体任务 恢复被中断的现场 Linux处理异常流程 异常发 ...
- CORS原理
http://blog.csdn.net/renfufei/article/details/51675148 https://html.spec.whatwg.org/multipage/infras ...
- php线性表数组实现的删除操作
php线性表数组实现的删除操作 一.总结 1.array_pop(): 函数删除数组中的最后一个元素. 二.代码 代码一: //线性表的删除(数组实现) function delete_array_e ...
- java方法调用之动态调用多态(重写override)的实现原理——方法表(三)
上两篇篇博文讨论了java的重载(overload)与重写(override).静态分派与动态分派.这篇博文讨论下动态分派的实现方法,即多态override的实现原理. java方法调用之重载.重写的 ...
- amazeui学习笔记--css(常用组件11)--分页Pagination
amazeui学习笔记--css(常用组件11)--分页Pagination 一.总结 1.分页使用:还是ul包li的形式: 分页组件,<ul> / <ol> 添加 .am-p ...
- 宏的使用 extern
声明全局变量使用的技术. 有些时候C语言的一些条条框框就像语法.学会C语言就是学会了语法. 但是语法怎样使用就又是另一回事了. 我希望自己能多学习一些技巧,而不是一些固定的C语言语法. 这篇文章真的很 ...