java拾遗录3
主题:java与链表不能不说的秘密
一、关于单向链表
关于链表和数组的讨论,是所有数据结构中所必提的,java自己封装了一些集合类,我们自己不需要去创建什么链表,但是作为一个基本能力,大家还是要有所了解的,下面的代码就是一个简单的单向链表,至于其他类型的链表将在后面一一展示出来。
创建节点类
/**
*@作者 qy
*@时间版本 版本1 下午04:53:15 2011-8-29
*/
public class Node
{
public Node next;
public Object value;
public Node(Object value,Node next)
{
this.value = value;
this.next = next;
}
@Override
public String toString()
{
return value.toString();
}
@Override
public boolean equals(Object obj)
{
return obj.toString().equals(value.toString());
}
}
创建链表 实现增删改查 功能
package array;
/**
*@作者 qy
*@时间版本 版本1 下午04:56:46 2011-8-29
*/
public class NodeToTest
{
public Node head;
/**
* 初始化链表
* 用对象数组遍历创建
* @param objects
*/
public NodeToTest(Object[] objects)
{
for (int i = objects.length-1; i >= 0; i--)
{
head = new Node(objects[i], head);
}
}
//空构造
public NodeToTest()
{
}
//首端插入
public void insertByFrist(Node newNode)
{
head = new Node(newNode, head);
}
//尾端插入
public void insertByLast(Node newNode)
{
if(head == null)
{
head = newNode;
}
else
{
Node temp = head;
while(temp.next != null)
{
temp = temp.next;
}
temp.next = newNode;
}
}
//按照项数删除 删除头项数为0
public void deleteByIndex(int index)
{
Node temp = head;
if (head == null)
{
System.out.println("链表为空");
return;
}
if(index == 0)
{
head = head.next;
return;
}
while(temp.next != null)
{
if(index == 1)
{
temp.next = temp.next.next;
return ;
}
temp = temp.next;
index--;
}
}
//按照对象删除
public void deleteByValue(Node deleteNode)
{
Node temp = head;
if (head == null)
{
System.out.println("链表为空");
return;
}
if(head.equals(deleteNode))
{
head = head.next;
return;
}
while(temp.next != null)
{
if (temp.next.equals(deleteNode) )
{
temp.next = temp.next.next;
return;
}
temp = temp.next;
}
}
//插入
public void insertByIndex(int index,Node newNode)
{
if(index == 0||head == null)
{
this.insertByFrist(newNode);
}
else
{
Node temp = head;
while(temp != null)
{
if(index == 1)
{
newNode.next = temp.next;
temp.next = newNode;
return;
}
temp = temp.next;
index--;
}
}
}
//返回链表大小
public int size()
{
Node temp = head;
int i = 0;
while(temp != null)
{
i++;
temp = temp.next;
}
return i;
}
//方便显示当前链表的内容
@Override
public String toString()
{
String string = "{";
Node temp = head;
while(temp != null)
{
string += "["+temp.value.toString()+"],";
temp = temp.next;
}
return string+"}";
}
}
测试类
package test;
import array.Node;
import array.NodeToTest;
/**
*@作者 qy
*@时间版本 版本1 下午05:04:44 2011-8-29
*/
public class Test4array
{
public static void main(String[] args)
{
Integer[] array = {1,2,3,4,5,6};
NodeToTest nodeToTest = new NodeToTest((Object[])array);
System.out.println(nodeToTest);
//插入测试
Node node = new Node(7, null);
nodeToTest.insertByFrist(node);
System.out.println(nodeToTest);
// nodeToTest.insertByLast(node);
// System.out.println(nodeToTest);
//删除测试
// nodeToTest.deleteByIndex(3);
// System.out.println(nodeToTest);
nodeToTest.deleteByValue(new Node(2, null));
System.out.println(nodeToTest);
//测试按位插入
nodeToTest.insertByIndex(2, new Node(2, null));
System.out.println(nodeToTest);
}
}
这些就是简单的一个单向链表。
对了,还有特别注意:
很多书上都说:链表在插入删除上要比数组快。这句话在理论上是没错的,但其实这只是理论,删除和插入之前都必须先找到位置,这个花费的时间可不是一点半点,所以........
二、带表头的双向链表
链表还有很多形式,譬如带表头的单向链表,双向链表,带表头的双向链表,带尾指针的......不过大部分操作都是一样的,所以来一个带表头的双向链表就好了。
package array;
/**
*@作者 qy
*@时间版本 版本1 下午07:11:50 2011-8-30
*/
public class ArrayToTest1
{
public Node1 head = new Node1();
public Node1 tail = head;
public ArrayToTest1(Object[] array)
{
for (int i = 0; i < array.length; i++)
{
tail.next = new Node1(array[i],tail,null);
tail = tail.next;
}
}
public void showByHead()
{
Node1 temp = head;
while (temp.next != null)
{
System.out.println(temp.next.value);
temp = temp.next;
}
}
public void showByTail()
{
Node1 temp = tail;
while (temp != head)
{
System.out.println(temp.value);
temp = temp.previous;
}
}
public static void main(String[] args)
{
Integer[] array = {1,2,3,4,5};
ArrayToTest1 arrayToTest1 = new ArrayToTest1(array);
arrayToTest1.showByTail();
}
}
操作什么的就自己想吧,哈哈哈
分享到:
相关推荐
NULL 博文链接:https://langyu.iteye.com/blog/1167581
Java知识拾遗:三大框架的技术起源 本篇文章主要讲述了Java开发中三大框架的技术起源,即Struts、Hibernate和Spring框架。这些框架是我们Java开发中的常用的框架,它们分别针对不同的应用场景给出最合适的解决方案...
java回顾、知识整理、拾遗、面试_java-review
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
11.java基础拾遗--匿名内部类语法详解.mp4
读书笔记:算法 并发 函数式编程 java语言拾遗 手写设计模式
09.java基础拾遗--类的加载和对象的构造过程.mp4
10.java基础拾遗--匿名内部类的应用--实现scala中的集合map方法.mp4
Java开发中的三大框架——Struts、Hibernate和Spring,都是为了解决传统Java Web应用程序中存在的一系列问题而诞生的。这些框架分别针对MVC模式的实现、数据持久化和依赖管理给出了高效且灵活的解决方案。 Struts...
Java开发中的三大框架,即Struts、Hibernate和Spring,各自解决了传统Java Web应用程序中的不同问题,提升了开发效率和代码质量。下面将详细讲解这三个框架的技术起源及其核心功能。 首先,Struts框架诞生于解决JSP...
Java语言拾遗 │ │ └─util 工具类 │ └─mq 消息队列 │ └─kafka └─resources 消息队列源码会作专题研究 关于消息队列使用参考另一个库:https://github.com/GitJavaProgramming/springboot_mybatis 参考...
**拾遗补缺** 除了上述主题,还要关注其他Java编程中的细节,如枚举、类型转换、异常层次结构、字符串操作、日期时间处理等。熟悉标准库中的各种类和方法,提高编码效率。 **视窗程式** 尽管Java主要用于服务器端...
17. 拾遗物品登记表.pdf
拾遗物品的管理制度是社会文明进步的标志之一,它体现了人们对于财物归属权的尊重以及对公共道德的维护。在中国传统文化中,拾金不昧被视为高尚的品德,而在现代社会,完善的拾遗物品管理制度则是社会主义精神文明...
在"day03 拾遗"中,特别提到了小数的取模运算。需要注意的是,Java中的小数取模与整数有所不同,可能会导致非预期的结果。例如,12.12%2.2的结果是1.1199,而8.8%2的结果是0。这是因为浮点数的取模运算并不总是精确...
### 有感于《路边拾遗》:摄影与心灵之旅 #### 一、摄影的意义与价值 《路边拾遗》是一本由两位非职业摄影师创作的摄影画册,书中不仅收录了他们拍摄的精美照片,更重要的是传达了作者对摄影艺术的理解与感悟。...
拾遗·椰雕.css
#### 一、Java语言拾遗 ##### 1、Vector与ArrayList - **起源与版本**:`Vector` 类自 JDK 1.0 就已存在,从 Java 2 平台 v1.2 开始进行了改进,实现了 `List` 接口,使其成为 Java Collections Framework 的一...