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下如何使用sftp命令【转】

linux下如何使用sftp命令 from&#xff1a; http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.htmlsftp 是一个交互式文件传输程式。它类似于 ftp, 但它进行加密传输&#xff0c;比FTP有更高的安全性。下边就简单介绍一下如何远程连接主机&#xff0c;进行文件…

netbean下搭建mariadb数据库

本人的操作系统Manjaro 最新版&#xff0c;mariadb版本为10.1.1&#xff0c;使用netbeasn开发java WEB&#xff0c;搭建过程如下&#xff1a; 1、安装数据库 pacman -S mariadb 2、启动数据库服务&#xff1a; systemctl start mariadb(启动) systemctl stop mariadb(关闭) 3、…

syslog打印不带等级_syslog之一:Linux syslog日志系统详解

目录&#xff1a;一、syslog简介syslog是一种工业标准的协议&#xff0c;可用来记录设备的日志。在UNIX系统&#xff0c;路由器、交换机等网络设备中&#xff0c;系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录&#xff0c;随时掌握系统状…

推进五通一平:手淘技术三大容器 五大方案首次整体亮相 百川开放升级

在云栖大会上&#xff0c;马云提出五个“新”&#xff0c;新零售、新制造、新金融、新技术和新能源&#xff0c;称将对各行各业造成巨大的影响&#xff0c;成为决定未来成败的关键。而五个新的实现&#xff0c;也必须是各行各业共同推进&#xff0c;整个生态共同受益的结果。继…

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

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

C#事件与接口

using System;namespace ConsoleApplication1d {delegate void MsgDel(string s);interface IMsg{event MsgDel msgd;void Excute(string s);}class MInfo : IMsg//必须实现接口的全部成员&#xff0c;如事件&#xff0c;函数{//不写这句会提示 Minfo does not implement inter…

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

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

2016-5-31 问题及解决

1.执行linux版本时&#xff0c;碰到官方默认发布的cef3二进制包&#xff0c;不支持在动态库中初始化cef3现象&#xff1a;启动时报一下错误->FATAL:content_main_runner.cc(662)] Check failed: base::allocator::IsAllocatorInitialized()原因&#xff1a;在共享库中初始化…

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有没有开窗函数_mysql实现开窗函数

mysql实现开窗函数开窗分析函数简单来讲就是相似partition by aaa, bbb order by ccc这样的形式mysql在使用mysql的过程当中遇到过这样的需求&#xff0c;须要求出一段时间内每一个item的最大值及对应的那一条记录。最大值很容易使用group by item求出来&#xff0c;可是求出那…

java 格式化时间计算

package com.roshi.utils.common;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class DateUtilsCom {/*** 格式化时间 * param date* return* author lzq* throws ParseException * date 2016年…

微信小程序点播插件_微信小程序 wxParse插件显示视频问题

修改wxParse/html2json.js 文件 &#xff0c;在 html2json(html, bindName)方法里var node {node: element,tag: tag,};这里使用 node.tag 能够获取标签类型&#xff0c;比如&#xff1a; img、embed、video这里我的系统后台编辑器使用的是ckeditor 上传视频。生成的便签是&am…

GridView - Batch Editing - How to cancel editing or disable the editor conditionally

Please refer to :https://www.devexpress.com/Support/Center/Example/Details/T115116转载于:https://www.cnblogs.com/michelledawm/p/5980940.html

linkerd mysql_Linkerd和k8s无法正常工作

我试图让我的头在kubernetes的链接。我在我的本地minikube中使用他们网站上的linkerd deamonset示例它全部部署在production命名空间中。当我尝试http_proxy$(kubectl --namespaceproduction get svc l5d -o jsonpath"{.status.loadBalancer.ingress[0].*}"):4140 cu…

mssql 跨库获取mysql

exec sp_addlinkedserver serverMYSQL, --这是链接服务器的名称 srvproductmysql, --这个你自己随便吧 providerMSDASQL, --这是固定的&#xff0c;不能瞎填&#xff0c;否则死定了 datasrcmyserver, --这是ODBC里面data source name,系统DNS locationNULL, provstrDRIVER{MyS…

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”&…

机器学习笔记——深度学习入门篇

前向传播与反向传播转载于:https://www.cnblogs.com/hdu-cpd/p/5988606.html

java 模板模式_Java模板模式(Template模式)

Java模板模式(Template模式)下一节>Template模式定义&#xff1a;定义一个操作中算法的骨架&#xff0c;将一些步骤的执行延迟到其子类中。其实Java的抽象类本来就是Template模式&#xff0c;因此使用很普遍。而且很容易理解和使用&#xff0c;我们直接以示例开始&#xff1…

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…