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. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格添加分页

    jQuery EasyUI 树形菜单 - 树形网格添加分页 本教程展示如何向带有动态加载特性的树形网格(TreeGrid)添加分页. 创建树形网格(TreeGrid) 启用树形网格(TreeGrid) ...

  2. Vue.js的后端数据支持:使用Express建立app, 并使用MongoDB数据库。

    需要用到的backed tech stack: Node: JavaScript on the server/backend. That's basically what it is, but mor ...

  3. 384. Shuffle an Array(java,数组全排列,然后随机取)

    题目: Shuffle a set of numbers without duplicates. 分析: 对一组不包含重复元素的数组进行随机重排,reset方法返回最原始的数组,shuffle方法随机 ...

  4. 141. Linked List Cycle&142. Linked List Cycle II(剑指Offer-链表中环的入口节点)

    题目: 141.Given a linked list, determine if it has a cycle in it. 142.Given a linked list, return the ...

  5. poj-2154-polya+euler函数

    Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11758   Accepted: 3783 Descriptio ...

  6. String.Format 格式化例子

    //格式为sring输出//   Label1.Text = string.Format("asdfadsf{0}adsfasdf",a);替换符//   Label2.Text  ...

  7. 灵活运用 SQL SERVER FOR XML PATH 转

    灵活运用 SQL SERVER FOR XML PATH   FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些 ...

  8. PAT 1046 Shortest Distance

    1046 Shortest Distance (20 分)   The task is really simple: given N exits on a highway which forms a ...

  9. 9. Palindrome Number(回文数)C++

    将int转换为string,注意for循环判断条件的简化 class Solution { public: bool isPalindrome(int x) { ) return false; str ...

  10. JAVA正则表达式:Pattern、Matcher、String

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...