代码部分
不多比比直接上代码
后面有代码的说明和我的思路,可能有不足之处,欢迎大神给出指正和建议
package data_structure;
import java.util.Scanner;
class linkedList<T> {
//数据域
//首指针
private Node first;
/**
*
* @author qi cui
* 定义单链表的数据形式
*
*/
//单个数据的数据形式
private class Node{
dataType<T> dataType;
Node next=null;
public Node(){
dataType=new dataType<>();
}
public Node(T data){
dataType=new dataType<>();
dataType.data=data;
}
}
private class dataType<T>{
T data;
}
/**
* 1:创建空数据结构
* 建立空单链表
*/
private void CreatLinkedList(){
//给first和end一个定义值
first=new Node();
}
/**
* 2:向数据结构中增加数据元素
* 向链表里面加入一个值
* 类型头插法
*/
public void add(Node node){
if(first.next==null){
first.next=node;
}
else{
node.next=first.next;
first.next=node;
}
}
public void add(T data){
Node node=new Node(data);
if(first.next==null){
first.next=node;
}
else{
node.next=first.next;
first.next=node;
}
}
/**
* 3:在数据结构中删除数据元素
* 删除操作
* 删除头节点(最先加入的数)(相当于出队操作)
*/
//删除最后一个加入的节点
public T poll(){
if(first.next!=null){
Node node=first.next;
first.next=first.next.next;
return node.dataType.data;
}
return null;
}
//删除某一个下标的节点
public T poll(int index){
//定义一个指针p
Node p=first;
for(int i=0;i<index-1;i++){
if(p.next==null){
return null;
}
p=p.next;
}
Node node=p.next;
p.next=p.next.next;
return node.dataType.data;
}
/**
* 4:在数据结构中查找某一个数据元素
* 查找操作
*/
public T find(int index){
//定义一个指针p
Node p=first;
for(int i=0;i<index-1;i++){
if(p.next==null){
return null;
}
p=p.next;
}
Node node=p.next;
return node.dataType.data;
}
/**
* 5:判空
*
* 判空操作
*/
public boolean isEmpty(){
return (first.next==null)?true:false;
}
/**
* 6:该数据结构的特别方法:无
*/
/**
* 创建类的时候直接创建链表
*/
public linkedList(){
CreatLinkedList();
}
}
/**
*
* @author qi cui
* 测试?
*
*/
public class testLinkedList{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
linkedList<Integer> list=new linkedList<Integer>();
//测试add方法
System.out.println("加入的值为:");
for(int i=0;i<10;i++){
list.add(i);
System.out.print(i+" ");
}
//测试isEmpty()方法
System.out.println("\n是否为空?"+list.isEmpty());
//测试poll()方法
System.out.println("删除最后一个值为:"+list.poll());
//测试find(int index)方法
System.out.println("查找第8个的值为:"+list.find(8));
//测试poll(int index);
System.out.println("删除第8个的值为:"+list.poll(8));
//剩下的值
System.out.println("删除剩余的值为:");
for(int i=0;i<8;i++){
System.out.print(list.poll()+" ");
}
//测试是否为空
System.out.println("\n是否为空?"+list.isEmpty());
}
}
说明部分
说明引言
对于刚学习数据结构的同学来说,单链表是学习数据结构的必经之路
下面是我对单链表的想法和理解
我们知道,链表在计算机中 是随机存储的,他的部分特点如下:
而再对比顺序表的部分特点
可以看出,顺序表和链表之间特点还是比较不同,甚至可以说有些互补那么下面我将从分析我所写代码的角度来分析这些特点形成的原因和问题
代码分析
首先是我的代码的大体思路,不光是这一篇,以后的我所写的所有代码都希望能够有封装的思想在里面。所以我所有的数据结构代码都会将单个的节点类写到一个类中,使其变为内部类。
在代码中,我一般会创立如下方法:
- 创建空数据结构
- 向数据结构中增加数据元素
- 在数据结构中删除数据元素
- 在数据结构中查找某一个数据元素
- 判空
- 该数据结构的特别方法
向单链表中增加数据元素通常有以下两种做法:
- 头插法
- 尾插法
下图为两种插入方式的直观了解
本程序使用的是头插法的方式
程序和注释如下:
public void add(T data){
//创建一个数据元素
Node node=new Node(data);
//如果这个链表是空的话
if(first.next==null){
//将数据元素放在头节点后面并不做任何操作
first.next=node;
}
else{
//将数据元素放在头节点后面
node.next=first.next;
//将头结点的next给数据元素
first.next=node;
}
}
由代码易得插入的时间复杂度是O(1)空间复杂度为O(1)
删除需要按照插入的形式而改变这里使用的是头插法的删除方式:
//这段代码只是删除第一个值所以删除的效率很高
public T poll(){
if(first.next!=null){
Node node=first.next;
first.next=first.next.next;
return node.dataType.data;
}
return null;
}
由代码也可以很轻松的看出,时间复杂度是O(1)空间复杂度是O(1)
下面是查找某一坐标的代码
public T find(int index){
//定义一个指针p
Node p=first;
for(int i=0;i<index-1;i++){
if(p.next==null){
return null;
}
p=p.next;
}
Node node=p.next;
return node.dataType.data;
}
由代码也可以很轻松的看出,时间复杂度是O(n)空间复杂度是O(1)
写在最后
以上就是我对单链表的理解和说明,在像单链表这样的数据结构中,更更重要的是单链表这种形式。在很多的数据结构中都有使用链表的形式形成的,以上文章的代码和说明可能会有一些问题,欢迎大家提出和指正!