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平台安装成功
Oracle EBS 功能顾问入门必备参考书目。共上下两册。每册分为两个压缩包,需要同时下载完后才能解压成功。本资源是上册第一个压缩包。其余压缩包请从本人其他上传资源中找。
本贴提供了基于wiod数据库测算的各国全球价值链地位数据 时间跨度:2001-2 014年 附件一:三篇GVC测算英文经典文献的学习笔记(Hummels,2001 ;Fally,2012;Wang z,2014) 附件二:测算code(do文档 ) 附件三:测算...
Oracle EBS 功能顾问入门必备参考书目。共上下两册。每册分为两个压缩包,需要同时下载完后才能解压成功。本资源是下册第一个压缩包。其余压缩包请从本人其他上传资源中找。
matlab数字图像处理GUI各种功能本人亲测,用matlab设计的GUI实现各种数字图像处理功能,有亮度变换,傅里叶变换,几何变换,彩色图像变换,小波变换,空域滤波,频域滤波,运动模糊,去噪声,加噪声,图像复原,图像...