JAVA数据结构之链表
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数据结构之链表的更多相关文章
- JAVA数据结构——单链表
链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...
- java数据结构之链表(java核心卷Ⅰ读书笔记)
1.链表 数组和ArrayList的一个重大缺陷就是:从中间位置删除一个元素要付出很大的代价,因为在这个元素删除之后,所有的元素都要向前端移动,在中间的某个位置插入一个元素也是这个原因. (小感悟:s ...
- 【Java数据结构】Java数据结构之链表反转
我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...
- Java数据结构之链表(Linked List)
1.链表(Linked List)介绍 链表是有序的列表,但是它在内存存储结构如下: 2.特点: 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 链 ...
- Java数据结构--单链表
#java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...
- Java数据结构——用链表实现栈
//================================================= // File Name : LinkStack_demo //---------------- ...
- java数据结构之链表的实现
这个链表的内部是使用双向链表来表示的,但是并未在主函数中进行使用 /** * 链表 * 2016/4/26 **/ class LinkList{ Node head = new Node(); No ...
- Java——数据结构(链表)
链表,可扩展长度,泛型. public class Link { Node header = null; //头结点 int length;//当前链表长度 class Node { Node nex ...
- java数据结构——单链表、双端链表、双向链表(Linked List)
1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...
随机推荐
- java中常规使用的mysql语句
1.登录型校验 limit 1,例如: SELECT `password`FROM workerWHERE phone = 18611406603LIMIT 1 结果无值,不需验证;有值,校验 2.存 ...
- Linux中Nginx安装教程
Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性: 在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的 ...
- 一些用Css实现的效果
今天写一个笔试题,其中有一个是用css实现直角梯形的效果,我给出的答案是: <style> .wrap{ width: 100px; height: 50px; border-top:90 ...
- jsp九个内置对象、四个域对象及Servlet的三大域对象
一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...
- composer的安装以及具体使用
1. 简介 Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 "pa ...
- java基础 ----- 程序的调试
--- -- 什么是程序调试 当程序出错时,我们希望可以这样 逐条语句执行程序 ----- 观察程序的执行情况 ------ 发现问题 ----- 解决问题 但是,程序一闪就运行结束 ...
- java_30对文件的操作
1.导包 导commons-io-2.4.jar包 2. public class Demo1Commons { public static void main(String[] args) { fu ...
- 使用SignalR进行实时通信
http://www.cnblogs.com/lonelyxmas/tag/%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E5%AD%A6%E4%B9%A0SignalR% ...
- spring boot自定义线程池以及异步处理
spring boot自定义线程池以及异步处理@Async:什么是线程池?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使 ...
- Biopython 安装使用
Biopython 官网:https://biopython.org/ 安装 Biopython https://biopython.org/wiki/Download 可以使用 pip 进行安装, ...