写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起。


  最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚。于是打算把链表这一块好好的学习学习。在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接。

  于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节点方法,deleteById按指定下标删除结点方法,showAll控制台查看所有元素方法,reverse反转当前链表方法,length获取当前链表长度方法,等基本方法。

  需要说明的是,这个类还有很多不足之处,它还有很多需要改进的地方。但是基本原理和单向链表是相同的,仅供参考。

 package demo_4;

 import java.util.Stack;

 public class MyList<Re_Helix> {
//节点内部类;
private class Node{
private Re_Helix data; //数据;
private Node next = null; //下个节点的引用; public Node() { //节点的无参构造;
super();
} public Node(Re_Helix data) { //节点的有参构造;
super();
this.data = data;
}
} private Node head; //头部节点;
private Node end; //尾部节点;
private Node point; //临时节点;
private int length; //长度属性; public MyList() { //链表的无参构造;
head = new Node();
end = head;
length = 0;
} public void input(Re_Helix data) { //给链表插入新值;
point = new Node(data);
if(length==0) {
end.data = point.data;
}else {
end.next = point;
end = point;
}
length++;
} public void inputById(int target,Re_Helix data) { //在指定下标的位置插入新值,如果两端超出范围,则分别按照head和end处理;
Node temp = new Node(data);
if(target>=length) {
end.next = temp;
end = temp;
}else if(target<=0) {
temp.next = head;
head = temp;
}else {
temp.next = packPoint(target);
packPoint(target-1).next = temp;
}
length++;
} public int length() { //返回链表的长度;
return length;
} public Re_Helix getById(int target) { //输入下标返回值;
return packPoint(target).data;
} public void showAll() { //在控制台查看当前链表中的所有数据
point = head;
int i = 0;
while(point!=null) {
System.out.println("第"+(i++)+"个:"+point.data);
point = point.next;
}
} public void reverse() { //将链表反转;
Stack<Node> s1 = new Stack<Node>(); //利用队列的先进先出的特性;
point = head;
while(point!=null) {
s1.push(point);
point = point.next;
}
head = s1.pop();
point = head;
while(!s1.isEmpty()) {
point.next = s1.pop();
point = point.next;
}
end = point;
end.next = null; //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环;
} public void deleteById(int target) { //输入下标删除值
if(target>0) {
packPoint(target-1).next = packPoint(target).next;
}else {
head = head.next;
}
length--;
} public void deleteAll() { //清空链表;
length = 0;
head.data = null;
head.next = null;
point = null;
end = head;
System.gc();
} public boolean editById(int target,Re_Helix data) { //修改传入下标位置的值;
if(target<0 || target>length) {
return false;
}else {
packPoint(target).data = data;
return true;
}
} private Node packPoint(int target) { //内部方法,将指针指向指定下标的节点;
if(target<=0) {
point = head;
}else if(target>=length) {
point = end;
}else {
int i = 0;
point = head;
while(i++!=target) {
point = point.next;
}
}
return point;
}
}

  本文为我的原创文章,转载必须注明链接和我的ID:sunziren,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。

  多有不足,欢迎评论区批评指正。

单向链表的简单Java实现-sunziren的更多相关文章

  1. 双向链表的简单Java实现-sunziren

    写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...

  2. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...

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

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

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

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

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

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

  6. JAVA单向链表实现

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

  7. JAVA 单向链表

    package com.session.link; /** * 单向链表 */public class LinkedList<T> { private Node head;//指向链表头节 ...

  8. C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

    实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...

  9. Java 单向链表学习

    Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...

随机推荐

  1. NJUPT_Wrj 个人训练实录

    9暑假了,开个训练实录,记录自己每天的训练以及补题(仅含个人训练,组队训练另开坑)希望能坚持下去QAQ 7.5日常:BZOJ1607线性筛.1601MST.1602LCA.1606背包.1625背包比 ...

  2. 编程思想(POP,OOP,SOA,AOP)

    1)POP--面向过程编程(Process-oriented programming ): 面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的过程,在程序设计 ...

  3. Apache Tomcat文件包含漏洞紧急修复

    Tomcat 漏洞 tomcat有漏洞, 需要升级到9.0.31 https://cert.360.cn/warning/detail?id=849be16c6d2dd909ff56eee7e26ae ...

  4. 我一个二本大学是如何校招拿到阿里offer的

    作者:薛勤,互联网从业者,编程爱好者. 本文首发自公众号:代码艺术(ID:onblog)未经许可,不可转载 01:终于步入大学 我既没有跨过山和大海,也没有穿过人山人海,我就是我,一个普通本科大学生. ...

  5. k8s 安装ELK(6.7.0版本)和EFK

    一.Elasticsearch安装 helm安装的也行,而且helm安装的stable/elasticsearch可用性更高,但是使用资源更多. 1.安装elasticsearch(线上环境千万记得把 ...

  6. shell脚本 定期删除日志

    定期删除日志: 然后建立清除日志文件的shell脚本,文件名为clean_log只保留最近三天的日志     #! /bin/bashlogdir=/var/log/httpdcd ${logdir} ...

  7. VNC 远程桌面 连接(安装桌面程序)

    1.修改linux启动方式       # vi /etc/inittab         将3改为5     id:5:initdefault:   2.关闭防火墙(或者单独打开接口)     #s ...

  8. python随用随学20200220-异步IO

    啥是异步IO 众所周知,CPU速度太快,磁盘,网络等IO跟不上. 而程序一旦遇到IO的时候,就需要等IO完成才能进行才能进行下一步的操作. 严重拖累了程序速度. 因为一个IO操作就阻塞了当前线程,导致 ...

  9. Git push时不需要总输入密码

    遇到问题: 最近因为换了自己的邮箱密码后,每次push的时候都需要填写密码,账号.很烦 解决方法: [戎马半生的答案] (http://www.cnblogs.com/zhaoyu1995/p/650 ...

  10. 出现ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly ....的解决方法

    在terminal上运行gluoncv时遇到了一个报错问题. ImportError: Python is not installed as a framework. The Mac OS X bac ...