[算法]单链表专题

如何判断链表环的入口位置?

一个指针从头开始单步走,一个指针从第一次相遇位置开始单步走,再相遇的位置就是环入口,证明如下:

设链表头到环入口位置距离为a,入口位置到第一次相遇位置为b,相遇位置回到入口位置距离为c。

1、每次走一步的慢指针走了s步,则快指针走了2s步。s=a+b。相遇时慢指针一定没走完一圈。

2、快指针走的总步数为a+b+n(b+c),走到相遇位置,并走了n圈。因此a+b+n(b+c)=2*(a+b)

a=n(b+c)-b=(n-1)(b+c)+c,也就证明了上面所提的方法。

 

class linklist
{
public:int val;linklist *next;linklist():next(NULL){}void push_back(int val);void clear();~linklist(){cout<<this->val<<" has been deleted"<<endl;}
};void linklist::push_back(int val){linklist *p=this;while(p->next!=NULL){p=p->next;}p->next=new linklist;p->next->val=val;
}void linklist::clear(){linklist *p=this,*ptmp;while(p!=NULL){ptmp=p->next;delete p;p=ptmp;}
}linklist* merge(linklist *p1,linklist *p2){if(p1==NULL){return p2;}if(p2==NULL){return p1;}linklist *head,*cur;if(p1->val<=p2->val){head=p1;cur=p1;p1=p1->next;}else{head=p2;cur=p2;p2=p2->next;}while(p1!=NULL && p2!=NULL){if(p1->val<=p2->val){cur->next=p1;cur=p1;p1=p1->next;}else{cur->next=p2;cur=p2;p2=p2->next;}}if(p1!=NULL){cur->next=p1;}if(p2!=NULL){cur->next=p2;}return head;
}linklist* merge_recur(linklist *p1,linklist *p2){if(!p1){return p2;}if(!p2){return p1;}if(p1->val<=p2->val){p1->next=merge_recur(p1->next,p2);return p1;}else{p2->next=merge_recur(p1,p2->next);return p2;}
}linklist* reverse(linklist *head){linklist *pre,*cur,*next;pre=NULL;cur=head;while(cur){next=cur->next;//传递next的值放开头,不放最后,可以避免cur为NULL的判断cur->next=pre;pre=cur;cur=next;}return pre;
}linklist* reverse_recur(linklist *head,linklist *&newhead){if(!head){return NULL;}linklist *p=reverse_recur(head->next,newhead);if(p){p->next=head;}else{newhead=head;}head->next=NULL;return head;
}linklist* find_cross(linklist *p1,linklist *p2){if(!p1 || !p2){return NULL;}int len1=1,len2=1;linklist *ptmp=p1;while(ptmp->next){len1++;ptmp=ptmp->next;}linklist *p1end=ptmp;ptmp=p2;while(ptmp->next){len2++;ptmp=ptmp->next;}if(ptmp!=p1end){return NULL;}//两个链表尾重叠了,证明链表交叉if(len1>len2){//去掉较长链表的多余部分,然后开始一一对比int count=len1-len2;while(count){p1=p1->next;count--;}}else if(len2>len1){int count=len2-len1;while(count){p2=p2->next;count--;}}while(true){if(p1==p2){return p1;}p1=p1->next;p2=p2->next;}return NULL;
}linklist* find_loop(linklist *head){linklist *p1=head,*p2=head;do{p1=p1->next;if(p2->next){p2=p2->next->next;}else{return NULL;}}while(p1 && p2 && p1!=p2);if(!p1 || !p2){return NULL;}p2=head;while(p1!=p2){p1=p1->next;p2=p2->next;}return p1;
}linklist* find_middle(linklist *head){linklist *fast=head,*slow=head;while(fast && fast->next){fast=fast->next->next;slow=slow->next;}return slow;
}linklist* del_last_k(linklist *head,int k){/*linklist *reval;linklist *tmp=head,*pre_tmp=NULL;//用来存放当前节点的前k个节点的地址int i=k-1;linklist *p=head;while(p->next){if(i==0){//先判断i,再进行i--,不能反过来pre_tmp=tmp;tmp=tmp->next;}p=p->next;if(i>0){i--;}}if(i>0){//如果i没到0,证明k的大小比链表还长,不用进行删除return head;}if(tmp==head){//如果删除了链表头,则需返回新的链表头reval=head->next;}else{reval=head;}if(tmp){if(pre_tmp){pre_tmp->next=tmp->next;}delete tmp;tmp=NULL;}return reval;*/linklist *p=head,*reval;while(p && k>0){p=p->next;k--;}if(p==NULL && k==0){//刚好删除第一个reval=head->next;delete head;return reval;}else if(p==NULL && k>0){//k长度超出链表长度,不需删除return head;}else{//要删的在第二个到最后一个之间,把p2移动到需要删除的元素之前linklist *p2=head;while(p->next!=NULL){p=p->next;p2=p2->next;}linklist *tmp=p2->next;p2->next=p2->next->next;delete tmp;return head;}
}//根据地址删除一个中间节点:把删除点后接节点的值复制到删除点,然后删除后接点
void DeleteMidNode(linklist *del){if (!del) {return;}linklist *next = del->next;if (next) {del->val= next->val;del->next= next->next;delete next;}
}//在给定地址的节点前插入节点:在给定地址点后插入,然后交换前后两节点的值
void insert_before(linklist *node,linklist *insert){if (!node || !insert) {return;}linklist temp = *node;node->val = insert->val;node->next= insert;*insert = temp;
}

 

转载于:https://www.cnblogs.com/iyjhabc/p/3254762.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批准Oracle IDM中的特定Web服务

关于Web服务端点的快速发布&#xff0c;OIM和SOA在与批准有关的场景中使用了Web服务端点- 基本内容&#xff0c;但对于初学者可能有用 。 Oracle IDM与SOA套件集成并利用其提供与批准相关的功能&#xff08;说实话&#xff0c;SOA相当丰富&#xff0c;并且也被用作Web服务连接…

Oracle15001,Oracle11gR2RAC环境DBCA创建数据库报错ORA-15055ORA-15001

在Oracle 11gR2 GridInfrastructure和Database软件安装完成之后&#xff0c;执行DBCA创建数据库到30%的时候报如下错误&#xff0c;点击OK后提示忽略并问题现象:在Oracle 11gR2 GridInfrastructure和Database软件安装完成之后&#xff0c;执行DBCA创建数据库到30%的时候报如下错…

linux 下访问mysql

1&#xff1a;先进到root:/# /usr/local/mysql/bin/2&#xff1a;root:/# mysql -u root -p Enter password: 转载于:https://www.cnblogs.com/gaoyinghui/p/3255148.html

针对新手的Java EE7和Maven项目–第8部分

第1部分 &#xff0c; 第2部分 &#xff0c; 第3部分 &#xff0c; 第4部分 &#xff0c; 第5部分 &#xff0c; 第6部分 &#xff0c; 第7部分 第8部分 自上一篇文章以来&#xff0c;这一系列教程已经有很长时间了。 是时候恢复并在我们的简单项目中添加新功能了。 正…

oracle_home path,ORACLE_HOME迁移后需要设置LD_LIBRARY_PATH环境变量

而设置LD_LIBRARY_PATH后&#xff0c;问题解决&#xff1a;[orat3hpserver2 ~]$ export LD_LIBRARY_PATH$ORACLE_HOME/lib[orat3hpserver2 ~]$ sqlplus / AS sysdbaSQL*Plus: Release 10.2.0.4.0 - Production ON Sun Mar 18 16:10:57 2012Copyright (c) 1982, 2007, Oracle. A…

栈的链式存储及其基本运算

#include <stdio.h> #include <stdlib.h> #define M 10typedef struct stnode {char data;struct stnode *next; }LinkStack;void InitStack(LinkStack *&ls) //初始化栈 {lsNULL; }void PushStack(LinkStack *&ls,char x)//进栈 {LinkStack *p;p(LinkSta…

oracle的导出参数statistic,使用expdp导出时评估所需存储容量大小

我们在使用expdp进行数据导出时&#xff0c;可以事先评估需要存储大小容量(bytes)&#xff0c;Oracle可以通过两种方式进行容量估算:[more]1)、通过数据块数量2)、通过统计信息中记录的内容估算具体是通过制定参数estimate_only和estimate来评估导出的性能参数estimate_onlyy|n…

玩Weld-Probe –一站式查看CDI的所有方面

焊接3.0.0.Alpha4被释放 &#xff0c;而我一直坐在在DevConf.CZ一间会议室。 Jozef Hartinger&#xff08; jozefhartinger &#xff09;或多或少地在几分钟前告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意&#xff0c;它是新的焊接探针机制。 什…

排列、组合问题(递归)

这里主要介绍字符串排列组合问题,高中数学常见的题目,不用详细介绍&#xff0c;看例子就可以解决问题 "1212" 全排列结果为 1212&#xff0c;1221&#xff0c;1122&#xff0c;2112&#xff0c;2121&#xff0c;2211 组合结果是 1,2,12 我所理解的排列组合结果是…

oracle日志文件大小规则,修改oracle日志文件大小

1、创建2个新的日志组alter database add logfile group 4 (D:\ORACLE\ORADATA\ORADB\REDO04_1.LOG) size 1024k;alter database add logfile group 5 (D:\ORACLE\ORADATA\ORADB\REDO05_1.LOG) size 1024k;2、切换当前日志到新的日志组alter system switch logfile;alter syste…

Java开发工具可以促进编程!

Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法&#xff0c;以使他们的编程工作更轻松。 由于情况发生了变化&#xff0c;因此出现了越来越多的工具。 因此&#xff0c;下面列出了大多数开发人员已经使用&#xff0c;将来使用或一定会使用的有用工具。 该列表包括…

linux cmake装在自己目录下,如何在Linux下安装cmake

全部展开OpenCV 2.2和更高版本需要使用Cmake生成生成文件&#xff0c;因此需要先安装cmake. 还有其他需要先安装cmake的软件1. 在Linux环境中打开Web浏览器&#xff0c;输入URL:mac cmake gui&#xff0c;找到最新版本的位置. 通常&#xff0c;发布了两个版本的开源软件: “源分…

Java Bootstrap:Dropwizard与Spring Boot

如何在尽可能短的时间内使准备就绪的Java应用程序投入生产&#xff1f; 我不是一个早起的人&#xff0c;所以有时需要一些时间才能启动“所有系统”提示。直到不久之前&#xff0c;这对于Java应用程序来说都是正确的&#xff0c;但是与发明贪睡功能不同闹钟&#xff0c;我们将在…

linux 查看libusb版本,linux / libusb获取usb设备路径

我使用libusb来枚举一些usb设备.现在我想获得“设备路径”.我认为这不是usb device-path,因为我没有成功使用谷歌.如果我用linux连接usb设备,我会在dmesg中收到一条消息,这里有一些带有usb温度传感器的“设备路径”的例子(类似于this)&#xff1a;H_301_3直接到usb端口&#xf…

如何使用Apache Drill分析高度动态的数据集

当今的数据是动态的&#xff0c;并由应用程序驱动。 由诸如Web /社交/移动/ IOT等行业趋势驱动的新业务应用时代的增长正在生成具有新数据类型和新数据模型的数据集。 这些应用程序是迭代的&#xff0c;并且关联的数据模型通常是半结构化的&#xff0c;无模式的且不断发展的。 …

MVC中不能使用原生态的#include ,可替代的解决方案

<!--#include file"../stuff/foo/box.aspx"--> 1.可以用 <%: Html.Partial("~/Views/foo/box.ascx") %>OR <% Html.RenderPartial("~/Views/foo/box.ascx"); %> 2. Html.Raw(File.ReadAllText(Server.MapPath("~/html/te…

linux备份日志文件脚本,Linux篇:Shell脚本实现Gitlab双备份

01 前言最近成功从架构组拿到了Gitlab的管理权限&#xff0c;第一件事就是想着如何备份&#xff0c;以防数据丢失背大锅&#xff0c;于是在网上搜索一番&#xff0c;发现一段非常赞的备份脚本&#xff0c;记录照着操作一下&#xff1a;尤其是第二篇文章博主&#xff0c;有非常多…

物理数据模型(PDM)-概念数据模型 (CDM)-面向对象模型 (OOM):适用于已经设计好数据库表结构了。...

步骤如下&#xff1a; 一、反向生成物理数据模型PDM 开发环境 PowerDesigner 15 ,SQL Server2005 &#xff08;1&#xff09;在开始逆向生成PDM图之前&#xff0c;需要为指定的数据库创建ODBC数据源。以Windows xp操作系统为例&#xff0c;选择“开始”/“运行”命令&#xff0…

带有Hibernate OGM的NoSQL –第二部分:查询数据

1月底发布了Hibernate OGM的第一个最终版本之后&#xff0c;团队一直在忙于制作一系列教程式博客&#xff0c;使您有机会轻松地从Hibernate OGM重新开始。 第一部分是关于设置和保留您的第一个实体 。 在第二部分中&#xff0c;您将学习如何查询数据。 Hibernate OGM将使您以几…

Linux下做一个arp欺骗程序6,LINUX下防ARP欺骗攻击

arp欺骗的原理不多述&#xff0c;基本就是利用发送假的arp数据包&#xff0c;冒充网关。一般在网上通讯的时候网关的IP和MAC的绑定是放在arp 缓存里面的&#xff0c;假的arp包就会刷新这个缓存&#xff0c;导致本该发送到网关的数据包发到了欺骗者那里。解决的办法就是静态arp。…