链表java实现
链表是用指针将多个节点联系在一起,通过头节点和尾节点还有节点数量,可以对链表进行一系列的操作。是线性表的链式存储实现。
1.链表是多个不连续的地址组成在一起根据指针链接在一起的,由多个节点组成,每个节点包括元素域和指针域
2.元素域存储节点数组,指针域存储下一节点指针
3.我们对链表的操作都是间接的通过链表头节点操作来实现的
4.一个链表中有多个节点,一个节点包括元素域,和下一节点指针域
5.最左边的节点是头节点,但是添加节点是从右到左添加,新添加的节点会被作为头节点
6.链表是由不定数量的节点连接(通过相互之间的引用)起来的,由于这种关系,在链表里我们只定义了头节点和节点数量。节点是由存储的对象及对下一个“节点”的引用封装而成。
7.在添加节点到链表中时,首先添加的节点后置后,新添加的节点作为头节点引用前一个添加的节点。
//先创建一个节点类
package linkedList;
//节点类
public class Node<E> {
protected Object data = null; //数据域
protected Node<E> next = null; //指针域 //初始化数据域
public Node(E e, Node<E> next) {
this.data = e; //初始化数据域
this.next = next; //初始化指针域
} //显示节点,获取当前实体对象,数据域
public Object getData(){
return this.data;
} //获取下一个实体,指针域
public Node<E> getNext(){
return this.next;
} @Override
public String toString() {
return "Node [data=" + data + ", next=" + next + "]";
} }
//然后创建我们的链表类,将节点作为链表的属性
package linkedList; import java.util.ArrayList;
import java.util.List; /**
* 1.链表是多个不连续的地址组成在一起根据指针链接在一起的,由多个节点组成,每个节点包括元素域和指针域
* 2.元素域存储节点数组,指针域存储下一节点指针
* 3.我们对链表的操作都是间接的通过链表头节点操作来实现的
* 4.一个链表中有多个节点,一个节点包括元素域,和下一节点指针域
* 5.最左边的节点是头节点,但是添加节点是从右到左添加,新添加的节点会被作为头节点
* 6.链表是由不定数量的节点连接(通过相互之间的引用)起来的,由于这种关系,在链表里我们只定义了头节点和节点数量。节点是由存储的对象及对下一个“节点”的引用封装而成。
* 7.在添加节点到链表中时,首先添加的节点后置后,新添加的节点作为头节点引用前一个添加的节点。
* @author LH-PC
*
*/
public class LinkedList<E> implements java.io.Serializable{
private static final long serialVersionUID = 1L; private Node<E> head; //头节点
private int size; //节点数量,即链表长度 //添加头节点 在添加链表节点时,首先添加的节点(头节点)后置,新添加的节点变成头节点,并且执向前一个头节点
public void addNode(E e){
//判断链表中有无该对象:从头节点开始遍历,匹配有无此对象
//如果有头节点,则添加新的节点为头节点,新的头节点指向上一个头节点
if(head != null){
System.out.println("链表中已经存在头节点, 正在添加新的头节点:" + e);
System.out.println("添加成功! 此头节点指向->" + head.data);
this.head = new Node<E>(e, head); //将新添加的节点作为头节点,指针域指向上一个头节点
size ++; //节点数量++ }else {
//如果没有头节点,则添加新的对象作为头节点,第一个头节点指向null
System.out.println("链表中不存在头节点,正在添加头节点:" + e);
this.head = new Node<E>(e, null);
System.out.println("添加成功!头节点指向->" + null);
size ++; //节点数量++
}
} //在指定位置插入节点
public int insert(int index, E e){
Node<E> temp = this.head;
int i = 0;
if(index < i || i > this.size){
System.err.println("索引大于链表长度或者小于0:" + index);
return -1;
} if(index == 0){
//如果index == 0,插入到头节点之后
this.head.next = new Node<E>(e, head.next); //将头节点指向新节点,将新节点指向原来头节点的下一个节点
size ++; //节点数量加1
return 1;
} //遍历链表
while(temp != null){
//运动到了指定位置
if(index == i){
temp.next = new Node<E>(e, temp.next); //将插入进来的指针域指向当前节点,将当前节点的上一个节点指针域指向当前节点
size ++; //节点长度加1
break;
}
temp = temp.next; //向下一个节点运动
i ++;
} return 1;
} //删除头节点
public void deleteByHead(){
//1.找到头节点。this.head
//2.更新头节点。将当前链表头节点设置为删除头节点的指针域
//3.链表节点数量-1
System.out.println("正在删除头节点:" + this.head.getData());
this.head = this.head.next; //更新头节点为下一节点
size --; //节点数量-1
System.out.println("删除成功"); } //删除指定位置的节点
public void deleteByIndex(int index){
//找到指定位置的前一个节点,将前一个节点指向后面两个节点。中间的节点就将被删除了。
Node<E> temp = this.head;
int i = 0;
if(index < i || index > this.size){
System.err.println("索引不能小于0或大于链表长度:" + index);
return;
} //如果索引为0,表示删除头节点
if( index == 0){
this.deleteByHead(); //调用删除头节点方法
return;
} //遍历链表
while(temp != null){
//找到目标节点的上一个节点
if(index-1 == i){
System.out.println("正在删除节点:" + this.head.next.getData());
temp.next = temp.next.next;
System.out.println("删除成功");
size --; //节点数减1
return;
}
temp = temp.next; //继续遍历
i ++;
} } //更新指定位置的节点
public void updateByIndex(int index, E e){
if(index < 0 || index > this.size){
System.err.println("索引小于0或者大于链表长度:" + index);
} // if(index == 0){
// this.updateByHead(e); //如果index==0,更新头节点
// } //遍历链表
int i = 0;
Node<E> temp = this.head;
while(temp != null){
if(index == i){
temp.data = e;
break;
}
temp = temp.next;
i ++;
} } //更新头节点
public void updateByHead(E e){
this.head.data = e; //为头节点重新赋值
} //打印链表中的所有数据 从头节点一直到尾节点。 (1).head (2).head.next (3).head.next.next (n).head.next.n.n
public void display(){
Node<E> temp = this.head;
//从头节点开始遍历到为尾节点
while(temp != null){
System.out.println(temp.getData());
temp = temp.next; //指向下一节点。
}
} //返回链表list
public List<Node<E>> findAll(){
List<Node<E>> list = new ArrayList<Node<E>>();
Node<E> temp = this.head;
while(temp != null){
list.add(temp);
temp = temp.next;
}
return list;
} //查找指定位置结点
public Node<E> findByIndex(int index){
Node<E> temp = this.head;
int i = 0; //参数校验,返回null
if(index < i || index > this.size){
System.err.println("参数大于链表长度或者小于0:" + index);
return null;
} //如果index == 0,返回头节点
if(index == 0){
return this.head; //如果下标为1,直接返回头节点
} //遍历链表进行匹配
while(temp != null){
if(i == index){
return temp; //匹配节点
}
temp = temp.next; //继续遍历
i ++;
}
return null;
} //获得链表节点数量
public int getSize(){
return this.size;
} //获取当前头节点
public Node<E> getHead(){
return this.head;
} //测试我的链表
public static void main(String[] args) {
LinkedList<Integer> linkedList = new LinkedList<Integer>(); //添加节点
linkedList.addNode(1);
linkedList.addNode(2);
linkedList.addNode(3);
linkedList.addNode(4);
linkedList.addNode(5);
linkedList.addNode(6); linkedList.insert(6, 9);
linkedList.updateByIndex(6, 9);
linkedList.display(); } }
链表java实现的更多相关文章
- 数据结构——单链表java简易实现
巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成 通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...
- 数组和链表--Java学习笔记(一)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 我是一个全职妈妈,两年前在上海一家人力资源 ...
- leecode 归并排序 链表(java)
写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...
- 单链表---java实现
单链表优点:1.不需要预先给出元素个数. 2.单链表插入删除时不需要移动数据元素. 单链表缺点:1.每个节点有指针,空间利用率低. 2.单链表不支持随机读取数据. Node.java package ...
- java数据结构之链表(java核心卷Ⅰ读书笔记)
1.链表 数组和ArrayList的一个重大缺陷就是:从中间位置删除一个元素要付出很大的代价,因为在这个元素删除之后,所有的元素都要向前端移动,在中间的某个位置插入一个元素也是这个原因. (小感悟:s ...
- LeetCode--021--合并两个有序链表(java)
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- 单链表Java实现
近期在复习基本数据结构,本文是单链表的Java实现,包含对单链表的实现插入删除查找遍历等.最后还实现了单链表的逆置. 实现了多项式相加,多项式相乘. 原文章及完整源码在这里 http://binhua ...
- 剑指offer面试题5:逆序打印单链表(Java)
Java创建单链表(头插法.尾插法),并逆序打印单链表: package day_0324; import java.util.Scanner; import java.util.Stack; cla ...
- 对象数组、集合、链表(java基础知识十五)
1.对象数组的概述和使用 * 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student[5]; //存储学生 ...
随机推荐
- 如何写一个Xss Bot
如何写一个Xss Bot 现在的ctf比赛里 xss的出题方式比较特殊,一般使用xss bot,所以借鉴大佬经验尝试弄一个xss题目. xss bot 就是代替管理员去完成点击页面的任务,bot需要能 ...
- WebGL——osg框架学习一
从今天开始,我们开始正式的学习osg框架,今天我们学习的是osg的渲染模块,我们来看一下代码结构. 所有DrawXXX的js模块都是渲染的模块,我们逐一来简单介绍一下,第一个Drawable.js,这 ...
- 曾经的华为C面试题,一点就通
学习编程可以锻炼你的思维,帮助你更好地思考,创建一种我认为在各领域都非常有用的思维方式. 比尔盖茨 曾经的华为C面试题,一点就通 [问题区] 有两个变量x和y, x=10; y = 2 ...
- SICP读书笔记 3.5
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- 服务器与Linux操作系统基础原理
1.服务器 2.Linux操作系统 1. 服务器 服务器定义与分类: 定义:一个管理资源并为用户提供服务的计算机软件. 按应用分类:通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应 ...
- 铁轨(rails, ACM/ICPC CERC 1997,Uva 514)
铁轨(rails, ACM/ICPC CERC 1997,Uva 514) 题目描述 某城市有一个火车站,铁轨铺设如图所示.有n节车厢从A方向驶入车站,按进站顺序编号为1~n.你的任务是让它们按照某种 ...
- PHP版本对比【转】
其他历史http://www.cnblogs.com/yjf512/p/3588466.html php5.3 改动: 1.realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如FI ...
- js/jquery去掉空格,回车,换行示例代码
Jquery: $("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));// ...
- No.111_第四次团队会议
后端的偏执 啊,这次又轮到我写团队博客了. 此时又是深夜,窗外漫天繁星.舍友的呼噜声惊吓了月亮,它害羞地跑回了云里去. 我关上灯拔掉机械,悄悄拿着电脑上了床,写这次的团队博客.曾经觉得自己绝对不会晚睡 ...
- 关于 error C2001: 常量中有换行符
看过之后,还是有所收获的,先mark一下 原链接: http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html#commentfo ...