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. Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)

    注解:代码里面特殊的标记,使用注解可以完成相关功能 注解写法:@注解名称(属性名.属性值) @Required 用在set方法上,一旦用了这个注解,那么容器在初始化bean的时候必须要进行set,也就 ...

  2. Flipping an Image

    Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...

  3. centos7更改时区

    1,linux系统更换时区 2,时间同步 1,linux系统更换时区 注:# timedatectl # 查看系统时间方面的各种状态 # timedatectl list-timezones # 列出 ...

  4. linux 查看系统资源命令

    vmstat vmstat 1 3 #每隔一秒刷新3次 lsof lsof | more #process->file lsof | /sbin/init #file->process l ...

  5. 7K - find your present (2)

    In the new year party, everybody will get a "special present".Now it's your turn to get yo ...

  6. Spring Cloud的小改进(五)

    1.在Eureka中不能看到具体服务的实例信息: 问题点:服务注册到 Eureka 之后,可以看到在 “Status” 显示的服务信息不明确(不知道具体的服务名等信息),如下图所示: 解决方法: 在服 ...

  7. MySQL数据库时间查询

    /*当前时间加1毫秒*/ SELECT DATE_ADD(NOW(),INTERVAL 1 MICROSECOND); /*当前时间减1毫秒*/ SELECT DATE_ADD(NOW(),INTER ...

  8. linux下创建密钥

    1.生成rsa文件 : a)ssh-keygen -t rsa,然后会提示在/root/.ssh/id_rsa这个路径下存放密钥文件 b)进入到/root/.ssh目录下,将id_rsa.pub更改为 ...

  9. python 09 文件操作

    一 流程: #1. 打开文件,得到文件句柄并赋值给一个变量 #2. 通过句柄对文件进行操作 #3. 关闭文件 二 例子 #1. 打开文件,得到文件句柄并赋值给一个变量f=open('a.txt','r ...

  10. python数据结构(二)------列表

    本文将重点梳理列表及列表操作. 2.1 list函数 2.2 基本列表操作 2.3 列表方法 2.1 list函数 >>>list('hello') ['h','e','l',l', ...