JAVA数据结构之链表

什么是链表呢?

链表作为最基本的数据结构之一,定义如下:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
简单来说呢,链表就是由一系列节点组成的,每个节点都包括两个部分,一个是该节点的值,另一个就是对于下一个节点的引用。

链表的结构表示图
链表的实现
public class ListNode {
//链表节点存放的数据
int val;
//链表的无参构造方法
public ListNode(){
}
//指向下一个节点的引用
ListNode next;
//链表的有参构造方法
public ListNode(int val){
this.val=val;
}
}
链表常用的操作
末尾插入节点:
/**
* 链表末尾插入节点
* @param node
*/
public void insertListNodeLast(ListNode node){
if(head==null){
head=new ListNode();
}
ListNode temp=head; while(temp.next!=null){
temp=temp.next;
}
temp.next=node;
}

注意的是需要使用一个临时指针temp用来指向链表的最后节点,其中while(temp.next!=null)代表当前是最后一个节点,而while(temp!=null)代表已经遍历完链表了,当前为空。

头部插入节点:
/**
* 头部插入节点
* @param node
*/
public void insertListNodeHead(ListNode node){
if(head==null){
head=new ListNode();
}
node.next=head.next;
head.next=node;
}
获取链表的长度:
/**
* 获取链表的长度
* @return
*/
public int getLength(){
if(head==null){
head=new ListNode();
}
ListNode temp=head;
int count=0;
while(temp.next!=null){
count++;
temp=temp.next;
}
return count;
}
将节点插入指定位置:
 /**
* 将节点插入指定位置
* @param position
* @param node
*/
public void insertListNode(int position,ListNode node){
if(head==null){
head=new ListNode();
}
ListNode temp=head;
int count=0;
while(temp.next!=null){
if(position==count){
node.next=temp.next;
temp.next=node;
return;
}
count++;
}
temp.next=node;
}
删除指定位置的元素:
/**
* 删除链表中指定节点
* @param position
*/
public void delete(int position){
if(head==null){
head=new ListNode();
}
if(position<1){
return;
}
ListNode temp1=head.next;
ListNode temp2=head;
int count=0;
for(int i=1;i<position;i++){
temp1=temp1.next;
temp2=temp2.next;
}
temp2.next=temp1.next;
}

这里删除节点采用的是双指针的方法,temp2指向删除节点,temp1指向删除节点的下一个节点,当遍历到删除节点的时候,只需要将temp1指向的节点赋给temp2.next就可以了。特殊情况是删除末尾节点,此时temp2指向末尾节点,而temp1此时为末尾节点,指向为空,temp2.next=temp1.next相当于直接将temp2指向为空。

遍历整个链表:
public void listPrint(ListNode node){
ListNode temp= head.next;
while(temp!=null){
System.out.println("data: "+temp.val);
temp=temp.next;
}
}

以上就是对单链表的基本操作了。

JAVA数据结构之链表的更多相关文章

  1. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...

  2. java数据结构之链表(java核心卷Ⅰ读书笔记)

    1.链表 数组和ArrayList的一个重大缺陷就是:从中间位置删除一个元素要付出很大的代价,因为在这个元素删除之后,所有的元素都要向前端移动,在中间的某个位置插入一个元素也是这个原因. (小感悟:s ...

  3. 【Java数据结构】Java数据结构之链表反转

    我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...

  4. Java数据结构之链表(Linked List)

    1.链表(Linked List)介绍 链表是有序的列表,但是它在内存存储结构如下: 2.特点: 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 链 ...

  5. Java数据结构--单链表

    #java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...

  6. Java数据结构——用链表实现栈

    //================================================= // File Name : LinkStack_demo //---------------- ...

  7. java数据结构之链表的实现

    这个链表的内部是使用双向链表来表示的,但是并未在主函数中进行使用 /** * 链表 * 2016/4/26 **/ class LinkList{ Node head = new Node(); No ...

  8. Java——数据结构(链表)

    链表,可扩展长度,泛型. public class Link { Node header = null; //头结点 int length;//当前链表长度 class Node { Node nex ...

  9. java数据结构——单链表、双端链表、双向链表(Linked List)

    1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...

随机推荐

  1. 解决Oracle数据库空间不足问题

    //查询表空间的大小以及文件路径地址select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space ...

  2. 转载:让Windows Server 2012r2 IIS8 ASP.NET 支持10万并发请求

    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误. 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支 ...

  3. 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问

    上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...

  4. maven之如何将自己的写的 maven 构件发布到 nexus 私服

    概念:Nexus服务器是一个代码包管理的服务器,可以理解 Nexus 服务器是一个巨大的 Library 仓库.Nexus 可以支持管理的工具包括 Maven , npm 等,对于 JAVA 开发来说 ...

  5. Saving custom fields in production order

    In additional data screen 1.PPCO0012->EXIT_SAPLCOKO1_001->ZXCO1U11 ​ ​ ci_aufk-zxxx = i_caufvd ...

  6. tiny4412 --Uboot移植(4) 串口

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  7. MySQL数据库(增删改查语句)

    MySQL数据库(增删改查语句)一.登录数据库:---->  mysql -uroot -proot;(对应用户名和密码)二.SQL语句:    数据定义语言DDL  用来定义数据库.表.列,关 ...

  8. 使用react-handsontable

    新建一个项目 create-react-app myProject cd myProject npm install handsontable 或者 npm install handsontable- ...

  9. MUI手势锁

    通过mui提供的手势锁插件实现,手势锁样式.存储需要自己完成. 1.样式展示 2.实现 2.1 html 需要一个div容器 <div class="mui-content" ...

  10. 机器学习之支持向量机(SVM)学习笔记

    支持向量机是一种二分类算法,算法目的是找到一个最佳超平面将属于不同种类的数据分隔开.当有新数据输入时,判断该数据在超平面的哪一侧,继而决定其类别. 具体实现思路: 训练过程即找到最佳的分隔超平面的过程 ...