单链表经典问题3_LeBron James m的博客-程序员秘密

技术标签: 链表  数据结构  

单链表中节点类型定义如下:

typedef struct link {
    
 int data;
 link* next;
}node,*linklist;

1.试编写在带头节点的单链表L中删除一个最小值节点的高效算法(假设最小值节点时唯一的)

void delete_MinX(linklist& L) {
    
//试编写在带头节点的单链表L中删除一个最小值节点的高效算法(假设最小值节点时唯一的)
 node* min_pre = L;//记录最小节点的前一个节点
 node* min_p=L->next;//用于指向最小值节点
 node* pre=L;//记录遍历时节点的前一个节点
 node* p = L->next;
 while (p != NULL){
    
  if (p->data <min_p->data) {
    
   min_pre = pre;
   min_p = p;
  }
  pre = pre->next;
  p = p->next;
 }
 min_pre->next = min_p->next;
 cout << min_p->data<<endl;
}

2.设在一个带头节点的单链表中所有元素节点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素

void delete_between(linklist& L, int x, int y) {
    
//设在一个带头节点的单链表中所有元素节点的数据值无序,试编写一个函数,
//删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素
 node* pre = L;
 node* p = L->next;
 while (p != NULL) {
    
  if (p->data <= y && p->data >= x) {
    
   pre->next = p->next;
   p = p->next;
   //free(p);
  }
  else {
    
   pre = p;
   p = p->next;
  }
 }
}

3.有一个带头节点的单链表L,设计一个算法使其元素递增有序

void sort(linklist& L) {
    
//有一个带头节点的单链表L,设计一个算法使其元素递增有序
 //方法1:断链,逐个插入法;
 if (L->next == NULL) {
    
  return;
 }
 node* p = L->next;
 node* rear = p->next;
 p->next = NULL;//断链,让其只剩下一个节点,最后采用插入法;
 p = rear;
 while (p != NULL) {
    
  rear = p->next;
  node* q_pre = L;//指向被插入位置的前一个节点
  node* q = L->next;
  while (q != NULL&&q->data<p->data) {
    
   q_pre = q;
   q = q->next;
  }
  p->next = q_pre->next;
  q_pre->next = p;
  p = rear;
 }
 //方法2:交换元素值
 /*int length = 0;
 node* p = L->next;
 while (p != NULL) {
  length++;
  p = p->next;
 }
 if (length <= 1) {
  return;
 }
 node* pre = L->next;;
 p = pre->next;
 int t = 1;
 while (t < length) {
  int tt = 0;
  pre = L->next;
  p = pre->next;
  while (tt < length - t) {
   if (pre->data > p->data) {
    int exchange = pre->data;
    pre->data = p->data;
    p->data = exchange;
   }
   pre = p;
   p = p->next;
   tt++;
  }
  t++;
 }*/
}

4.给定两个单链表,编写算法找出两个链表的公共节点。

linklist Common(linklist A, linklist B) {
    
//给定两个单链表,编写算法找出两个链表的公共节点。
//算法思路:先走K步,然后一同走;
 int length1 = 0;
 int length2 = 0;
 node* p = A->next;
 node* q = B->next;
 while (p != NULL) {
    
  p = p->next;
  length1++;
 }
 while (q != NULL) {
    
  q = q->next;
  length2++;
 }
 int k;
 if (length1 >= length2) {
    
  k = length1 - length2;
  p = A->next;
  while (k > 0) {
    
   p = p->next;
   k--;
  }
  q = B->next;
 }
 else {
    
  k = length2 - length1;
  q = B->next;
  while (k > 0) {
    
   q = q->next;
   k--;
  }
  p = A->next;
 }
 while (p!=NULL&&q!=NULL&&p->data != q->data) {
    //同时走找公共节点
  p = p->next;
  q = q->next;
 }
 cout << p->data;
 if (p->data == q->data) {
    
  return p;
 }
 return NULL;
}

5.给定一个带表头节点的单链表,设head为头指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间

void fun1(linklist& head) {
    
//给定一个带表头节点的单链表,设head为头指针,试写出算法:
//按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间
//不允许数组作为辅助空间
 while (head->next != NULL) {
    
  node* min_pre = head;
  node* min_p = head->next;//设刚开始最小值就是第一个结点
  node* pre = head;
  node* p = head->next;
  while (p != NULL) {
    
      if (p->data < min_p->data) {
    
    min_p = p;
    min_pre = pre;
   }
   pre = p;
   p = p->next;
  }
  cout << min_p->data << endl;
  min_pre->next = min_p->next;
 }
}

6.将一个带头节点的单链表分成两个单链表,A存放奇数结点,B存放偶数结点
在这里插入图片描述

void fun2(linklist& L) {
    
//将一个带头节点的单链表分成两个单链表,A存放奇数结点,B存放偶数结点
 node* la = (node*)malloc(sizeof(node*));//创建链表A的头节点
 node* lb = (node*)malloc(sizeof(node*));//创建链表B的头节点
 la->next = NULL;
 lb->next = NULL;
 node* p = L->next;
 node* rear = la;
 int t = 1;
 while (p != NULL) {
    
  node* temp = p->next;
  if (t % 2 == 1) {
    //采用尾插法
   p->next = rear->next;
   rear->next = p;
   rear = p;
  }
  else {
    //采用头插法
   p->next = lb->next;
   lb->next = p;
  }
  t++;
  p = temp;
 }
 display(la);
 display(lb);
}

7.在一个递增有序的线性表中,有数值相同的元素存在,若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素

void delete_same(linklist& L) {
    
//在一个递增有序的线性表中,有数值相同的元素存在,若存储方式为单链表,
//设计算法去掉数值相同的元素,使表中不再有重复的元素
 node* pre = L->next;//指向大小相等的结点中的第一个结点
 if (pre == NULL) {
    
  return;
 }
 node* p = pre->next;
 while (p != NULL) {
    
  if (p->data == pre->data) {
    //说明中间有相同的元素
   p = p->next;
  }
  else {
    
   pre->next = p;
   pre = p;
   p = p->next;
  }
 }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42168411/article/details/108514415

智能推荐

Webservice-WSDL详解(三)_qq_33974741的博客-程序员秘密

怎样向别人介绍WS的功能呢?一般咱们会写接口文档,亦或口头告诉使用的人。这些方式都存在问题:其中一个我上篇中说过,客户端是无法直接使用服务端接口的;二是程序员在电脑前,想使用WS时,他们的工具(如Eclipse、VS)无法提供任何帮助,因为这些工具根本不了解你的WS。解决方案就是定义一套人和电脑都能阅读的规范或文档,因此WSDL首当其冲,你可以把WSDL理解成既是文档,又是代码。它基于XML语...

redis配置记录_修改 redis conf 拒绝访问_程序员_小小的博客-程序员秘密

redis配置的坑一、保护模式DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connection...

swoole_process源码分析之kill操作_lcli的博客-程序员秘密

swoole_process提供的kill操作用于向指定pid进程发送信号。bool swoole_process::kill($pid, $signo = SIGTERM);默认的信号为SIGTERM,表示终止进程 $signo=0,可以检测进程是否存在,不会发送信号下面我们看下其流程。static PHP_METHOD(swoole_process, kill){ ...

ESC ubuntu16.04 ipv6配置_ubuntu 16.04配置ipv6_菜鸟方圆圆的博客-程序员秘密

1.申请一个ipv6地址https://www.tunnelbroker.net/创建通道Create Regular Tunnel1.1 创建一个账号1.2 填写你 ECS 的公网 IP 地址以及选择隧道节点,点击 Create Tunnel 创建。注:填写 IP 时出现 IP is a potential tunnel endpoint. 说明可以添加 ipv6 隧道。1....

设计模式面试相关_pan_mlpan的博客-程序员秘密

设计模式什么是设计模式设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。为什么要学习设计模式看懂源代码:如果你不懂设计模式去看Jdk、Spring、SpringMVC、IO等等等等的源码,你会很迷茫,你会寸步难行看看前辈的代码:你去个公司难道都是新项目让你接手?很有可能是接盘的,前辈的开发难道不用设计模式?编写自己的理想中的好代码:我个人反正是这样的,对于我自己开发的项目我会很认

随便推点

科研文献|中国的肠道微生物群及其与主食类型、民族和城市化的关系_肠道菌群文献 csdn_作图帮的博客-程序员秘密

中国的肠道微生物群及其与主食类型、民族和城市化的关系Chinese gut microbiota and its associations with staple food type, ethnicity, and urbanization研究介绍肠道微生物群对人类健康和疾病影响重大。目前我国仍然缺乏全国性的中国肠道微生物群基线研究。肠道微生物群的失衡(即生态失调)与许多疾病有关,然而,将微生物群研究转化为临床实践仍然受到多重挑战的限制。我们对来自8 个民族、居住在28 个省的63个县/市的2678

智能跳过节假日算法java_java计算两个日期之间的天数,排除节假日和周末_寻找猫的博客-程序员秘密

如题所说,计算两个日期之前的天数,排除节假日和周末。这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天。不够很坑的是每个日期都要查询数据库,感觉很浪费时间。原则:1.节假日存放在数据库中实现步骤:1.循环每个日期2.判断每个日期是否为节假日或者为周末3.若不是节假日和周末,天数+1代码:public doublecalLeaveDays(Date startT...

ubuntu 下串口调试工具 minicom安装与配置cutecom安装_asm2826的博客-程序员秘密

安装minicom:$sudo apt-get install minicom配置minicom:如果您的系统的默认语言不是英文,请执行下面的命令:$LANG=EN 这样在接下来的设置中,minicom将以英文界面呈现在我们面前,操作起来比较方便。 在系统终端输入...

json(http://www.asp.net/whitepapers/request-validation)_yujiaping37的博客-程序员秘密

.net处理JSON简明教程Json.Net是.net中的一种流行的高性能的JSON框架。特点灵活的JSON序列化转化.net对象为JSON字符串。和把JSON字符串转换为.net对象。手动读写JSON的Linq to JSON比.net内置的JSON序列化程序更高的性能和速度。便于读写的JSON从XML中读取或写入JSON支持S

offsetTop、offsetLeft、offsetWidth、offsetHeight_A_山水子农的博客-程序员秘密

//获取坐标位置function getpos(e){ var t=e.offsetTop; var l=e.offsetLeft; var height=e.offsetHeight; while(e=e.offsetParent){ t+=e.offsetTop; l+=e.offsetLeft;

java之IOC原理理解和框架实现_vincentff7zg的博客-程序员秘密

总结:IOC即依赖注入,IOC常见的注入形式有三种:构造函数时注入,set方法注入,调用真正的业务函数时以入参注入(最原始的方法)下文对于IOC的注入原理和方式讲的比较清晰了,这里再补充一种注入框架:包括使用自定义注解标记欲注入的属性,根据注解注入的机制实现。自定义注解标记欲注入的属性:首先需要定义一个注解例如MyIOC,然后在类中需要注意的属性上标记@MyIOC,然后添加se