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. WebSocket前后台交互

    其实对于前后台交互有很多种方法(只列举我知道的,嘻嘻): 1:from 表单: 使用场景——小信息量提交给后台 2:ajax(跨域的话用jsonp): 可以进行多量的前后台信心传递: 但实时性不高,不 ...

  2. nodejs实现文件的拷贝复制

    var fs = require( 'fs' ), stat = fs.stat; /* 05 * 复制目录中的所有文件包括子目录 06 * @param{ String } 需要复制的目录 07 * ...

  3. PHP加密函数

    单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出.这个散列计算是单向的,即不能对固定长度的输出进行计算从而获取输入信息. 特征:雪崩效应.定长输出和不可逆 作用: ...

  4. tchart5

    https://blog.csdn.net/wuyuanjingni/article/details/8585810

  5. 雷林鹏分享:使用 XSLT 显示 XML

    使用 XSLT 显示 XML 通过使用 XSLT,您可以把 XML 文档转换成 HTML 格式. 使用 XSLT 显示 XML XSLT 是首选的 XML 样式表语言. XSLT(eXtensible ...

  6. Juniper基础配置

    root> show configuration | display set      配置按set行显示,查看的配置为未commit的配置(commit check)root# set sys ...

  7. ubuntu vi配置

    1.先卸载tiny版本vi 输入命令:sudo apt-get remove vim-common 2.然后再输入命令: sudo apt-get   install vim sudo vim /et ...

  8. hammer.js方法总结(只做了一个简单的demo)

    html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  9. 查看cookie的快捷方法

    1.url中输入数字+javascript:alert(document.cookie)   如:2javascript:alert(document.cookie)   ,然后在浏览器中去掉2,回车 ...

  10. redis 基本指令

    redis-cli开启redis客户端 1. set key value // 设置key-value 2. get key // 获取key 3. delete key [] // 删除key 4. ...