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.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...
随机推荐
- 解题(ConflictPhoneNumber--冲突的电话号码)
题目描述 移动推出的校内网短号和亲情网短号非常方便,但在某款新手机里却出现了尴尬的bug.例如,当通讯录中包含如下号码时:1.小王:6002.小李:4676543.小张:600010输入600时,手机 ...
- java编译带中文是显示乱码的错误
FirstJava.java:3: 错误: 编码GBK的不可映射字符 System.out.println("娆㈣繋瀛︿範Java绋嬪簭锛?")锛? ^FirstJava.java ...
- UNIX网络编程(卷1)——学习过程中遇到的新词语
第2章 传输层:TCP.UDP.SCTP TCP Trasmission Control Protocol 传输控制协议 UDP User Datagram Protocol 用户数据报协议 SCTP ...
- ES6学习笔记(函数)
1.函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') { console.log(x, y); } log(' ...
- <a>超链接用作下载
在a标签里添加 download="" ,“ ”里面的内容可随意写,比如文件名. <a href="/download/武林秘籍.pdf" downl ...
- 解决cpplint在Python 3下没有任何输出的问题
修改cpplint.py:1. main()中注释掉 # sys.stderr = codecs.StreamReaderWriter(sys.stderr, # codecs.getreader ...
- Windows学习"Network Analysis in Python"
原代码仓库的地址为 Network Analysis in Python. 主要按照里面的README.md 进行操作,全部仓库有100MB以上.考虑到数据比较大,再加上我对原笔记文件有修改,建议从我 ...
- vue中html页面写入$t(‘’)怎么显示
1.在 main.js 中引入 vue-i18n (前提是要先引入 vue) 1 2 import VueI18n from'vue-i18n' Vue.use(VueI18n) 2.准备本地的翻译信 ...
- java tcp ip网络编程(二) 套接字的基本使用
##基本套接字的使用 linux系统把网络io抽象成socket,对网络的编程就是对socket的编程. java把套接字抽象成类似的类 InetAddress SocketAddress 识别jav ...
- HTML5学习路线导航
一.基本标签元素 1.基础标签第一篇 2.基础标签第二篇 3.表单form的使用 4.新增表单验证 二.CSS样式表 4.CSS插入样式表的三种格式 5.六大选择器 6.样式内容详细讲解 7.背景渐进 ...