1线性链表是由结点组成的,一个结点又是由数据域和指针域两部分组成的,数据域中存放的就是数据元素, 指针域中的指针值对应的就是存储器中的一个存储地址。
2每一个结点所占用的空间是一段连续的空间。不同结点的物理存储位置可能是相邻的,也可能不相邻。
3每个结点都是在程序运行时动态创建的,并不知道每个结点的存储位置,需要关心的是数据元素之间的逻辑关系,即用指针来表示出的关系。
4整个链表都是由一个头指针Head指出,也就是说头指针唯一确定该链表。
5单链表就是说单向链表,也就是只有一个指针域。
这些概念性的知识点就是为了实际操作做铺垫,现在就说一下方法:
定义一个结点类:
public class Node { Object obj; //数据域 Node next; //指针值 // Node index; public Node(Object obj){ this.obj=obj; //this.next=next; } }
定义一个链表类:
public class LinkList { Node head = null; Node last = head; public static void main(String[] args) { } }
在此类中定义方法,第一个添加元素方法:
public void add(Object obj) { Node node = new Node(obj); if (head == null) { head = node; last = node; } else { last.next = node; last = node; } }
无论是更改或者删除一个元素,前提是要可以通过索引得到该元素,通过索引得到该元素的前提是先得到该链表的长度:
//得到链表长度 public int getlength() { int length = 0; Node node = head;//获取头结点,则可获得此链表,但不能直接用头节点,因为头节点会往后移 while (node != null) { length++; node = node.next; } return length; }
通过索引得到元素的方法:
//通过索引得到链表中元素的值 public Node getNode(int index) { if (index >= 0 && index < this.getlength()) { Node node = head; while (node != null) { if (count == index)//当当前计数等于索引,则跳出循环 break; count++; node = node.next; //继续往下数 } return node; } return null; }
删除和更改方法就容易得多了:
// 从表头向表尾计数 public void delete(int index) { if (index < 0 || index >= this.getlength()) { throw new RuntimeException("下标越界"); } if (index == 0) { //如果是头结点 head = head.next; } else { Node n1 = this.getNode(index - 1); Node n2 = this.getNode(index + 1); n1.next = n2; } } //根据索引更改链表中的元素 public void update(int index, Node node) { Node node2 = getNode(index); node2 = node; }
遍历打印该链表(递归):
public void printLinkList(Node head) { if (head != null) { System.out.println(head.obj); Node node = head.next; printLinkList(node); } }
那么怎样判断一个链表上是否有环呢?因为本人之前有写根据下标得到结点的方法,所以这个方法基于那个方法写就容易得多了~:
//判断一个链表是否有环 private boolean isCircle(){ for(int i=0;i<list.getlength();i++){ for(int j=1;j<list.getlength();j++){ if(getNode(i).next==getNode(j).next){//若两个指针指向同一个结点,则代表有环 System.out.println("环入口结点为第"+i+"个"+"该链表上有环"); return true; } } } return false; }
关于单链表反转,本来也想用getNode(),但是不知怎么回事总报错(得再想想),所以就寻了一个方法,这个方法很好玩,它是建了一个空表头,这表头就放在那里,通过改换指针指向,将后面的所有结点反转,当然是真的反转而不是仅仅改变了元素的值,不过说实在的,下面那五个赋值当时把我真绕懵了(其实我真是看中了这5个赋值),但觉得这楼主写的挺好,就盗用了~
相关推荐
因此,本人作为一名机械工程师基于自己浅薄的认识和能力开发了该款DCC尺寸链计算工具。 该软件占用内存小,使用方便。 可用极值法、概率法、仿真法计算一维线性尺寸链,可进行正计算、中间计算和反计算。基本可以...
本程序无任何限制,无错误,无版权,免费用,交个朋友,本人承接各种小零活(ASP+access),仿站,仿源码,修改修复问题源码,混口饭吃,谢谢! 本人时间有限,本程序的页面是山寨自别的网站,程序为自己设计,在此...
免费自助链接导航无限制版无任何限制,无错误,无版权,免费用,交个朋友,本人承接各种小零活(ASP access),仿站,仿源码,修改修复问题源码,混口饭吃,谢谢! 本人时间有限,本程序的页面是山寨自别的网站,...
通过这种方式,每一个新的修改都会创建一个新的记录版本,并且其回滚指针指向前一次修改的记录,形成了一个链表结构。这个链表的头部是最新的数据版本,而尾部则是最初的数据版本,即事务开始前的数据状态。 撤销...
本人用买的自动链程序,绝对可用。 自动链接无须注册,只要在贵站首页做好本站链接,并点击一次进来,系统将自动提取贵站首页标题、关键字自动在下面显示!以后每次点进来您都是第一位! 后台:admin.asp admin ...
本人在Centos7搭建以太坊私链的实践教程,从准备环境开始介绍,以图文的形式说明了搭建以太坊私链的各个步骤
供应链管理与服务企业通过商业模式与供应链服务创新,可以改变、优化供应链的组合结构、运作方式和利益分配关系,在帮助供应链企业增强盈利和抗风险能力的同时,获得自身的市场空间和独特的竞争优势。 供应链管理...
考生本人患病经历和疫情防控承诺表.doc
这是本人开发的新一代程序设计语言,称为类自然语言,命名为开蒙语言。这个语言类似自然语言。蕴含知识,可据有无限词汇量,语言的内涵和外延可动态演进。传统编程语言的命令或语句过于细碎,功能弱,数量有限。用...
供应链管理与服务企业通过商业模式与供应链服务创新,可以改变、优化供应链的组合结构、运作方式和利益分配关系,在帮助供应链企业增强盈利和抗风险能力的同时,获得自身的市场空间和独特的竞争优势。供应链管理无论...
K/3供应链培训PPT,内部资料。为本人项目工作中用到的资料
本人使用代码 本人使用代码 本人使用代码
本人自创两种方法脱VMP.............
介绍一下你的资料吧,这...奋斗链! 注明本程序不是我原创的! 我只是修改了一些小BUG及加一些简单的功能 功能上的添加: 添加了百度快照 添加了留言本 添加了站长资讯功能 添加了站长查询工具(需要可以与本人索取)
linux ftp服务器的配置及各种知识点,本人亲自总结.docx
himx200 编译链由于文件接近4个G无法上传 所以上传了百度云盘链接,链接长期有效 本人已在x86_64的linux平台安装成功
2. 全球价值链(GVC)方法:本研究特别使用了全球价值链方法来评估汽车及相关行业的最新趋势。全球价值链方法强调了产品从生产到销售的各个环节在全球范围内的分工和价值增值过程。 3. 研究对象范围:尽管分析覆盖...
Oracle EBS 功能顾问入门必备参考书目。共上下两册。每册分为两个压缩包,需要同时下载完后才能解压成功。本资源是上册第一个压缩包。其余压缩包请从本人其他上传资源中找。
本贴提供了基于wiod数据库测算的各国全球价值链地位数据 时间跨度:2001-2 014年 附件一:三篇GVC测算英文经典文献的学习笔记(Hummels,2001 ;Fally,2012;Wang z,2014) 附件二:测算code(do文档 ) 附件三:测算...
Oracle EBS 功能顾问入门必备参考书目。共上下两册。每册分为两个压缩包,需要同时下载完后才能解压成功。本资源是下册第一个压缩包。其余压缩包请从本人其他上传资源中找。