




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java链表数据结构及其简单使用方法解析目录认识链表结构单向链表双向链表加深对链表结构的理解实现单向和双向链表的反转实现把链表中给定的值都删除小结
认识链表结构
单向链表
单链表在内存中的表示:
可以看到,一个链表的节点包含数据域和指向下一个节点的引用,链表最后一个节点指向null(空区域)。
我们可以根据这一定义,用Java语言表示一下单向链表的结构:
publicclassNode{
publicintvalue;
publicNodenext;
publicNode(intvalue){
this.value=value;
}
在链表的结构中,有数据域value,以及一个指向下一个节点的引用next。
TIP:这里的value还可以定义成泛型的。
双向链表
我们再来看一下双向链表的结构:
双向链表中的节点有数值域,和指向它前一个节点的引用以及指向它后一个节点的引用,据此我们可以定义出
双向链表的结构:
publicclassDoubleNode{
publicintvalue;
publicDoubleNodepre;
publicDoubleNodenext;
publicDoubleNode(intvalue){
this.value=value;
}
加深对链表结构的理解
实现单向和双向链表的反转
说明:
对于一个链表如图所示:
反转的意思是,将原来链表上的节点指针指向反转,原来的指向是:a-b-c-d-null,变成现在的指向:d-c-b-a-null,
即反转后的结构如图所示:
这个题目不难,我们转换一下指针的指向就行了。
设计这样一个函数,函数的过程是调整链表各节点的指针指向,那么这个函数的要素有:
返回值是链表的新的头结点,这样能保证函数执行完,原链表变成一个有新的头结点的链表需要传入一个链表,用头结点表示
解题技巧:定义两个Node引用辅助我们反转指针指向。
代码实现:
publicstaticNodereverseNode(Nodehead){
Nodepre=null;
Nodenext=null;
//最终让head指向null
while(head!=null){
next=head.next;
head.next=pre;
pre=head;
head=next;
returnpre;
}
我们来模拟一下这个函数的执行过程。
链表原始状态:
方法开始执行,此时head.next不为空,所以,执行如下步骤:
next=head.next:让next指向head(当前节点)的下一个节点,即b
head.next=pre:让当前节点的下一个节点指向pre,即null
此时当前节点从原来指向b,改为指向null。
pre=head:让pre指向当前节点head=next:让当前节点指向next,相当于移动head节点,直到将head节点移动到原来tail节点的位置
第一次循环执行结束,此时head为b,不是null,所以继续循环,执行流程:
此时head为c,不是null,所以继续循环,执行流程如下:
同理,此时head为d,不是null,继续循环:
这是就完成了单链表的反转步骤。
有了单链表反转的经验,我们很容易就能实现双向链表的反转,代码如下:
publicDoubleNodereverseDoubleNode(DoubleNodehead){
DoubleNodepre=null;
DoubleNodenext=null;
while(head!=null){
next=head.next;
//操作(移动)当前节点
head.next=pre;
head.pre=next;
pre=head;
head=next;
returnpre;
}
实现把链表中给定的值都删除
题如:给定一个单链表头节点head,以及一个整数,要求把链表中值为给定整数的节点都删除。
实现思路:
要实现的函数需要给我传一个头节点以及给定的数值,头节点确定链表。func(Nodehead,intnum)。函数给不给返回值,返回值是什么?试想,针对链表3-5-4-3-4-5,假如要删除4,那么新链表就是3-5-3-5,头节点仍然是原来的节点3;而如果要删除值为3的节点呢,删除后就是5-4-4-5,头节点变了。因此,我们要设计的这个函数需要返回新链表的头节点。上述分析得知,需要返回新链表的头节点,因此也就是要返回第一个不是给定值的节点(因为给定值的节点都要被删除掉)。
//head移动到第一个不需要删除的位置:边界条件
while(head!=null){
if(head.value!=num){
break;
//head右移
head=head.next;
//跳出循环之后,head的情况:
//1.head=null,这种情况是链表中的值全部是给定值,全删了
//2.head!=null
//中间操作
//最终返回head:第一个不是给定值的节点
returnhead;
head移动到第一个不需要删除的位置后,head若为null,表示所有节点都删除了,直接返回就可以了;若head不为null,借助两个辅助变量Nodepre和cur,从head处开始往next走,遇到给定值就跳过。
Nodepre=head;
Nodecur=head;
while(cur!=null){
if(cur.value==num){
pre.next=cur.next;
}else{
pre=cur;
cur=cur.next;
这一执行过程图解如下:
通过上述分析,写出完整实现代码:
publicstaticNoderemove(Nodehead,intnum){
while(head!=null){
if(head.value!=num){
break;
head=head.next;
Nodepre=head;
Nodecur=head;
while(cur!=null){
if(cur.value==num){
pre.next=cur.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务分析题库及答案
- 2025中介服务合同
- 智能制造生产线设备采购合同
- 贵州国企招聘2025贵阳供销集团有限公司所属企业第一批招聘21人笔试参考题库附带答案详解
- 浙江国企招聘2025年绍兴市新昌县国有企业公开招聘工作人员66人笔试参考题库附带答案详解
- 青少年班试题及答案
- 2025辽宁抚顺市龙晟保安服务有限责任公司招聘20人笔试参考题库附带答案详解
- 2025福建南平绿发集团有限公司招聘28人笔试参考题库附带答案详解
- 2025春季福建省港口集团有限责任公司校园招聘219人笔试参考题库附带答案详解
- 无人机物流引领低空经济新趋势
- 2025专利代理师笔试题库完美版带答案分析
- 2025企业主要负责人安全培训考试试题及答案典型题
- 机械样机摆放协议书
- 2025-2030中国开关插座行业市场发展分析及前景趋势与投资研究报告
- 2025年嘉兴市九年级中考语文一模试卷附答案解析
- 2025年安徽数学中考第2题:科学计数法【含答案】
- 中国移动通信集团新疆有限公司昌吉州分公司招聘笔试题库2025
- 2024年榆林市社区专职工作人员招聘考试真题
- 人教部编版三年级语文下册 课课练-第21课 我不能失信(含答案)
- 2025廊坊师范学院辅导员考试题库
- 2025上半年黑龙江大庆市肇源县人才引进110人重点基础提升(共500题)附带答案详解
评论
0/150
提交评论