python 单链表是否有回路_第5章 第1节 链表

● 请你说出几种基本的数据结构,

参考回答:

常见的基本的数据结构有链表、栈、队列、树(只列出面试常考的基本数据结构)

1、链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。

栈和队列是比较特殊的线性表

栈是限制插入和删除只能在一个位置上进行的表,后进先出

队列只允许在front端进行删除操作,在rear端进行插入操作,

树:树型结构是一类非常重要的非线性数据结构,考察主要以二叉树为主,

● 手写代码:怎么判断链表有环,怎么找环节点

参考回答:

判断是否有环以及环节点

public class Solution {ListNode EntryNodeOfLoop(ListNode h){if(h == null || h.next == null)return null;ListNode slow = h;ListNode fast = h;while(fast != null && fast.next != null ){slow = slow.next;fast = fast.next.next;if(slow == fast){ListNode p=h;

ListNode q=slow;//相当于让q指向了m1

复制代码1

2

3

4

5

6

7

8

9

10while(p != q){

p = p.next;

q = q.next;

}

if(p == q)

return q;

}

}

return null;

}

● 手写代码:一个单向链表,给出头结点,找出倒数第N个结点,要求O(N)的时间复杂度;

参考回答:

JAVA版本:

public class Solution {public ListNode FindNthToTail(ListNode head,int N) {ListNode pre=null,p=null;

//两个指针都指向头结点

p=head;

pre=head;

//记录N值

int a=N;

//记录节点的个数

int count=0;

//p指针先跑,并且记录节点数,当p指针跑了N-1个节点后,pre指针开始跑,

//当p指针跑到最后时,pre所指指针就是倒数第N个节点

while(p!=null){p=p.next;count++;if(N<1){pre=pre.next;}N--;}

//如果节点个数小于所求的倒数第N个节点,则返回空

if(count

C/C++版本:

复制代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32class Solution {

public:

ListNode* FindNthToTail(ListNode* pListHead, unsignedint N) {

if(pListHead==NULL||N==0)

return NULL;

ListNode*pTail=pListHead,*pHead=pListHead;

for(int i=1;i

{

if(pHead->next!=NULL)

pHead=pHead->next;

else

return NULL;

}

while(pHead->next!=NULL)

{

pHead=pHead->next;

pTail=pTail->next;

}

return pTail;

}

};

Python:

class Solution:

def FindNthToTail(self, head, N):

# write code here

res=[]

while head:

res.append(head)

head=head.next

if N>len(res) or N<1:

return

return res[-N]

● 请问如何判断一个单向链表存在回路?

参考回答:

方法1:用一个指针数组A,存储已访问过的节点。用一个指针p,每次在链表上移动一步,然后与指针数组A比较,若数组中没有指针与p相同,说明第一次访问p,将p放入数组中;若有指针与p相同,则存在环路,且第一次相同的节点就是环的入口点。

链表长度为n,则需要空间o(n),且每次要与指针数组比较,时间复杂度为 O(n^2)。

方法2:在节点上记录该节点是否被访问过,如果在指针移动过程中遇到已访问过的节点,说明存在环路。同样地,第一次相同的节点就是环的入口点。

方法3:用两个指针,pSlow,pFast,一个慢一个快,慢的一次跳一步,,快的一次跳两步,如果快的能追上慢的就表示有环(pSlow == pFast )。

● 请问如何判断一个链表是否有环

参考回答:

方法1:用一个指针数组A,存储已访问过的节点。用一个指针p,每次在链表上移动一步,然后与指针数组A比较,若数组中没有指针与p相同,说明第一次访问p,将p放入数组中;若有指针与p相同,则存在环路,且第一次相同的节点就是环的入口点。

链表长度为n,则需要空间o(n),且每次要与指针数组比较,时间复杂度为 O(n^2)。

方法2:在节点上记录该节点是否被访问过,如果在指针移动过程中遇到已访问过的节点,说明存在环路。同样地,第一次相同的节点就是环的入口点。

方法3:用两个指针,pSlow,pFast,一个慢一个快,慢的一次跳一步,,快的一次跳两步,如果快的能追上慢的就表示有环(pSlow == pFast )。

● 请问如何判断两个链表是否相交

参考回答:

从头遍历两个链表。创建两个栈,第一个栈存储第一个链表的节点,第二个栈存储第二个链表的节点。每遍历到一个节点时,就将该节点入栈。两个链表都入栈结束后。则通过top判断栈顶的节点是否相等即可判断两个单链表是否相交。因为我们知道,若两个链表相交,则从第一个相交节点开始,后面的节点都相交。若两链表相交,则循环出栈,直到遇到两个出栈的节点不相同,则这个节点的后一个节点就是第一个相交的节点。

node temp=NULL; //存第一个相交节点

while(!stack1.empty()&&!stack1.empty()) //两栈不为空

复制代码1

2

3

4

5

6

7

8

9{

temp=stack1.top();

stack1.pop();

stack2.pop();

if(stack1.top()!=stack2.top())

{

break;

}

}

● 手写代码:循环链表插入元素

参考回答:

typedef struct _tag_CircleListNode{struct _tag_CircleListNode * next;}CircleListNode;typedef struct _tag_CircleList{CircleListNode header;CircleListNode* slider;int length;}TCircleList;

//插入元素

int CircleList_insert(CircleList* list, CireListNode* node, int pos){int ret = 0, i=0;TCircleList* sList = (TCircleList*)list;if (list == NULL || node== NULL || pos<0){return -1;}CircleListNode* current = (CircleListNode*)sList;for(i=0; (inext != NULL); i++){current = current->next;}

//current->next 0号节点的地址

复制代码1

2node->next = current->next; //1

current->next = node; //2

//若第一次插入节点

if( sList->length == 0 ){sList->slider = node;}sList->length++;

//若头插法 current仍然指向头部

//(原因是:跳0步,没有跳走) 中间第一种情况

复制代码1

2if( current == (CircleListNode*)sList )

{

//获取最后一个元素

复制代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24CircleListNode* last = CircleList_Get(sList, sList->length - 1);

last->next = current->next;//3

}

return ret;

}

CircleListNode* CircleList_Get(CircleList* list,int pos)// O(n)

{

TCircleList* sList = (TCircleList*)list;

CircleListNode* ret = NULL;

int i = 0;

if (list==NULL || pos<0)

{

return NULL;

}

{

CircleListNode* current = (CircleListNode*)sList;

for(i=0; i

{

current = current->next;

}

ret = current->next;

}

return ret;

}

37459640131347fdc2870ca6427d081b.png

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

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

相关文章

linux mysql管理软件_8款适合Linux用户使用的数据库管理工具!

从内容管理系统到简单的表格&#xff0c;数据库是每一个开发项目的一部分。这就是为什么开发者们如此强调使用正确类型的数据库工具。下面这些可能对您有所帮助&#xff01;Autotabla是一个你的程序的SQL数据表的CGI管理界面。只需要提供你数据库架构的XML描述&#xff0c;你就…

jq 下拉加载每次只执行一次_记一次 无限列表 滚动优化

背景长列表优化&#xff0c; 是页面性能优化中的一个比较常见的问题&#xff0c;也是面试中的常客。刚好最近在的项目中&#xff0c; 遇到了一个长列表的性能问题&#xff0c;试过多种方案&#xff0c; 最后得以解决。今天就给大家分享一下。正文场景描述用户需要批量修改 Prod…

mysql fio测试_Linux下 fio磁盘压测笔记

专业的测试磁盘IO性能的软件&#xff1a;1、fio 【推荐使用】2、iometerfio的使用&#xff1a;参考博客&#xff1a; http://lilinji.blog.51cto.com/5441000/1569623https://linux.die.net/man/1/fiohttp://elf8848.iteye.com/blog/2168876 【讲的比较好】注意&#xff0c;我…

清除浮动塌陷的4种经典套路

【自古深情留不住&#xff0c;总是套路得人心。】 这些日子&#xff0c;各个朋友圈随时可以见到这句话的身影。的确人们常说&#xff1a;“多一点真诚&#xff0c;少一点套路。”&#xff0c;但是最终现象写实也是那么残酷和无奈。 同样在前端攻城狮的道路&#xff0c;我们都是…

mysql standalone模式_Boss7 Standalone模式开发配置

PS&#xff1a;以下配置均添加到standalone.xml文件中。1.Get请求编码设置&#xff0c;将如下配置添加到标签之后2.开启开发模式&#xff1a;搜索“urn:jboss:domain:web:1.1”&#xff0c;在此标签下添加如下配置&#xff1a;3.虚拟域名设置搜索“urn:jboss:domain:web:1.1”&…

python ide: pycharm

1, 设置python路径 2&#xff0c;运行py文件 https://www.jetbrains.com/help/pycharm/2016.1/creating-and-running-your-first-python-project.html#d50296e226 3, 格式化代码 From the main menu, select Code | Reformat Code or press CtrlAltL. 转载于:https://www.cnblo…

Android 滑动菜单框架--SwipeMenuListView框架完全解析

SwipeMenuListView&#xff08;滑动菜单&#xff09; A swipe menu for ListView.--一个非常好的滑动菜单开源项目。 Demo 一、简介 看了挺长时间的自定义View和事件分发&#xff0c;想找一个项目练习下。。正好印证自己所学。 在github上找到了这个项目&#xff1a;SwipeMenuL…

JAVA 开发axis2_基于Apache axis2开发Java Web服务

1.安装配置axis2环境下载好后把axis2-1.4.1-war目录下面的axis2.war发布到tomcat的webapps中。发布好&#xff0c;访问&#xff1a;http://localhost:8079/axis2/ 界面如下&#xff1a;2.开发web服务1)创建一个java web project2)编写服务代码1 public classSampleService {23…

Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

前言 本文主要写给使用命令行来操作Git的用户&#xff0c;用于提高Git使用的效率。至于使用命令还是GUI&#xff08;Tortoise Git或VS的Git插件&#xff09;就不在此讨论了&#xff0c;大家根据自己的的喜好选择就好。我个人是比较推荐使用命令行的&#xff0c;因为命令行是原生…

java cache-control_详解浏览器Cache-Control缓存策略

原来用的是 Expires 策略,浏览器可以直接从浏览器缓存读取数据&#xff0c;而无需再次请求&#xff0c;它的值对应一个 GMT&#xff0c;来告诉浏览器资源缓存过期时间&#xff0c;如果还没过该时间点则不发请求。例如下面的例子,这是京东的首页里找的一个,时间都干到 2027 年了…

前端必备切图ps篇

前言&#xff1a;当设计师通过photoshop工具设计完设计稿导出psd文件时&#xff0c;我们前端工程师该如何进行切图转换成网页的所需的图片呢&#xff0c;接下来讲讲如何利用photoshop工具快速简洁的切图&#xff0c;因为ps工具用到的行业很多&#xff0c;涉及到的各个行业&…

jenkins配置记录(2)--代码发布流程

在我们的日常运维工作中&#xff0c;使用jenkins来完成业务代码发版上线是至关重要的一环。前面已经提到在jenkins上添加用户权限的操作&#xff0c;今天重点说下如何在jenkins下构建项目工程进行代码发布&#xff1f; 在此简单介绍下jenkins进行代码发布的流程&#xff08;根据…

autoitv3点击windows界面

在自动化测试过程中会遇到如下windows安全认证&#xff0c;需要输入账号和密码&#xff0c;这个认证对话框不属于element元素。无法用selenium操作&#xff0c;需要用autoitv3操作&#xff0c;输入账号密码后&#xff0c;再进行web元素操作。 有2中方式&#xff1a; 第一种&…

java 扩展接口_详解常用的Spring Bean扩展接口

前言Spring是一款非常强大的框架&#xff0c;可以说是几乎所有的企业级Java项目使用了Spring&#xff0c;而Bean又是Spring框架的核心。Spring框架运用了非常多的设计模式&#xff0c;从整体上看&#xff0c;它的设计严格遵循了OCP----开闭原则&#xff0c;即&#xff1a;1、保…

c盘java文件误删_C盘爆满怎么办,教你有选择性删除文件,恢复空间

有很多朋友说电脑c盘有很多垃圾&#xff0c;占着空间&#xff0c;还导致电脑响应变慢。还不知道能不能删除&#xff0c;很困扰。那么c盘文件都是什么文件呢&#xff1f;哪些能删除&#xff0c;做一次全面的清理呢&#xff1f;下面给大家介绍一下program Date&#xff1a;系统文…

java向另一activity输入_Activity经典实例一:两个Activity传递数据和对象

1、概述&#xff1a;Activity类直接或者间接地继承了Context、ContextWrapper、ContextThemeWrapper等基类&#xff0c;因此Activity可以直接调用它们的方法。创建一个Activity需要实现某些方法&#xff0c;常见的是实现onCreate(Bundle status)方法&#xff0c;该方法将会在Ac…

深入理解JSON对象

深入理解JSON对象 前面的话 json(javascript object notation)全称是javascript对象表示法&#xff0c;它是一种数据交换的文本格式&#xff0c;而不是一种编程语言&#xff0c;用于读取结构化数据。2001年由Douglas Crockford提出&#xff0c;目的是取代繁琐笨重的XML格式。本…

java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型

左图为高速缓存 右图为多级缓存数据的读取和存储都经过高速缓存&#xff0c;CPU核心与高速缓存有一条特殊的快速通道。主存与高速缓存都是连接在系统总线上&#xff0c;当然其他组件也是在此基础上进行通信的。在高速缓存出现后不久&#xff0c;系统变得愈加复杂&#xff0c;高…

CentOS 7 安装SVN服务端

CentOS7下安装SVN服务 1. yum命令即可方便的完成安装# sudo yum install subversion 测试安装是否成功&#xff1a;# svnserve --version 更改svn的默认配置(更改默认的指向目录和默认端口)# sudo vim /etc/sysconfig/svnserve编辑示例&#xff1a;OPTIONS"-r /data/svn -…

.NET简谈事务、分布式事务处理

在本人的 “ .NET简谈事务本质论”一文中我们从整体上了解了事务模型&#xff0c;在我们脑子里能有一个全局的事务处理结构&#xff0c;消除对数据库事务的依赖理解&#xff0c;重新认识事务编程模型。 今天这篇文章我们将使用.NET C#来进行事务性编程&#xff0c;从浅显、简单…