package cn.com.factroy2;

/**
* 可以看做是操作链表的工具类,链表的核心结构就是节点的数据结构
* @author wanjn
*
*/
public class SinglyLinkedList {
//存放头结点
private Node head;
//存放尾节点
private Node last;
//链表长度
private int size = 0; /**
* 默认在最后添加元素
* @param data
*/
public void add(Object data){
addLastNode(data);
}
/**
* 向链表中添加头节点
* @param data
*/
public void addFirstNode(Object data){
if (head==null) {//添加的第一个节点作为头结点
head = new Node(data, null);
last = head;
}else {//不是头结点,将新的节点作为头结点
head = new Node(data, head);
}
size++;
}
/**
* 清空链表
*/
public void clear() {
int length = length();
for (int i = 0; i < length; i++) {
delete(0);
}
}
/**
* 向链表中添加尾部节点
* @param data
*/
public void addLastNode(Object data){
//head 要保持不变
if (head==null) {//这里可以使用新增一个辅助节点的监督元思想,去掉一个判断,减少执行判断的时间;当然啦最后需要将监督元删除即可
head = new Node(data, null);
last = head;
}else {
last.next=new Node(data, null);
last = last.next;
}
size++;
}
/**
* 获得链表的长度
* @return 长度
*/
public int length(){
return size;
}
/**
* 根据索引设置对应节点的值
* @param index
* @param data
*/
public void set(int index,Object data){
getNode(index).data=data;
}
/**
* 根据索引删除对应的节点
* @param index
*/
public void delete(int index){
Node current = getNode(index);
//删除头结点
if (index==0) {
if (size==1) {
head = null;
}else {
head = getNode(index+1);
}
}else if (index == size-1) {
//删除尾节点
last =getNode(index-1);
getNode(index-1).next=null;
}else {
//删除非头结点和尾节点
Node pre = getNode(index-1);
Node next = getNode(index+1);
pre.next = next;
}
//这个必须放在后面,不能放在开始,否则会影响(找不到)下一个节点的查找
current.next = null;
size--;
}
/**
* 根据索引获取链表对应节点的值
* @param index
* @return
*/
public Object get(int index){
return getNode(index).data;
}
@Override
public String toString() {
String result="";
Node temp = head;
if (temp!=null) {
while (temp!=null) {
result+= temp.data+ ", ";
temp = temp.next;
}
result = result.substring(0,result.lastIndexOf(", ")) ;
}
return "["+result+"]" ; }
/**
* 根据索引获取链表对应节点
* @param index
* @return
*/
private Node getNode(int index){
if (index<0||index>=size) {
throw new RuntimeException("索引超出范围!");
}
Node temp = head;
for (int i = 0; i <size; i++) {
if (i==index) {
break;
}
temp = temp.next;
}
return temp;
}
/**
* 将节点的关系操作封装在了node的构造方法中
* @author
*
*/
private class Node {
public Object data;
public Node next;
public Node(Object data, Node next) {
super();
this.data = data;
this.next = next;
}
} }

java 实现单向链表的更多相关文章

  1. Java实现单向链表基本功能

    一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...

  2. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  3. java实现单向链表的增、删、改、查

    单向链表 作者:vashon package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public ...

  4. Java实现单向链表

    /* 先定义一个Node类用来存储节点的值域和指针域 * 即当前节点中的值和后面节点的方法 * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 */class LNode{//这个写法已经 ...

  5. Java实现单向链表的增删改查

    class List<T> { private class Node { private T data; private Node next; private Node(T data) { ...

  6. Java实现单向链表反转

    public class LinkedListTest { public static void main(String[] args) { Node A = new Node("A&quo ...

  7. [Java算法分析与设计]--单向链表(List)的实现和应用

    单向链表与顺序表的区别在于单向链表的底层数据结构是节点块,而顺序表的底层数据结构是数组.节点块中除了保存该节点对应的数据之外,还保存这下一个节点的对象地址.这样整个结构就像一条链子,称之为" ...

  8. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  9. 线性表的Java实现--链式存储(单向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...

随机推荐

  1. ubuntu 下Visual Studio Code 安装

    Build in Visual Studio Code Install VSCode The easiest way to install for Debian/Ubuntu based distri ...

  2. Getting Started with Processing 第五章的easing问题

    分析 使用 easing easing 的感官目的是为了 draw 的时候,画的图形不是即时 mouseX 的值,而是稍有落后一点.从算法分析,就是让所画图形的 x 坐标 落后于 mouseX 的值, ...

  3. 雷林鹏分享:XML to HTML

    XML to HTML 在 HTML 页面中显示 XML 数据 在下面的实例中,我们打开一个 XML 文件("cd_catalog.xml"),然后遍历每个 CD 元素,并显示HT ...

  4. 非常棒的——python Deep learning 学习笔记

    https://www.cnblogs.com/zhhfan/p/9985991.html

  5. 教你一招 - 如何安装nopcommerce2.5

    教你一招 - 如何安装nopcommerce2.5 29. 五月 2012 16:22         /          wcf         /          教你一招 . 解决方案    ...

  6. BGP - 1,基本概念

    1,BGP知识点 a)AS号:私有(64512-65535),公有(0-64511). b)什么时候使用BGP:有数据穿越本AS前往其他AS:本AS有多条到其他AS的连接:必须要做策略.   c)BG ...

  7. 『Python』setup.py简介

    setup.py应用场合 网上见到其他人这样介绍: 假如我在本机开发一个程序,需要用到python的redis.mysql模块以及自己编写的redis_run.py模块.我怎么实现在服务器上去发布该系 ...

  8. 第二阶段——个人工作总结DAY06

    1.昨天做了什么:昨天做完了修改密码的界面.(有点丑) 2.今天打算做什么:今天制作时间轴. 3.遇到的困难:无.

  9. mysql半同步开启

    开启半同步复制 #在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制 /etc/my.cnf plugin-load = "rpl_semi_sync_ ...

  10. 【其他】【navicat】【1】navicat导入txt文件中文乱码问题解决

    正文: TXT文件默认编码为ANSI,另存为编码为UTF-8的文本文件即可 备注: 1,一般需要导入的数据都是一张excel表,需要将excel表另存为“文本文件(制表符分隔)(*.txt)”保存类型 ...