单向链表的简单Java实现-sunziren
写在前面,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的更多相关文章
- 双向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...
- 单向链表的归并排序——java实现
在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
- 线性表的Java实现--链式存储(单向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...
- [Java算法分析与设计]--单向链表(List)的实现和应用
单向链表与顺序表的区别在于单向链表的底层数据结构是节点块,而顺序表的底层数据结构是数组.节点块中除了保存该节点对应的数据之外,还保存这下一个节点的对象地址.这样整个结构就像一条链子,称之为" ...
- JAVA单向链表实现
JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...
- JAVA 单向链表
package com.session.link; /** * 单向链表 */public class LinkedList<T> { private Node head;//指向链表头节 ...
- C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码
实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...
- Java 单向链表学习
Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...
随机推荐
- 使用 TF-IDF 加权的空间向量模型实现句子相似度计算
使用 TF-IDF 加权的空间向量模型实现句子相似度计算 字符匹配层次计算句子相似度 计算两个句子相似度的算法有很多种,但是对于从未了解过这方面算法的人来说,可能最容易想到的就是使用字符串匹配相关的算 ...
- 全网最详细的Linux命令系列-Screen远程会话命令
screen 管理你的远程会话 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份.ftp 传输等等.通常情况下我们都 ...
- Spark中的RDD和DataFrame
什么是DataFrame 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格. RDD和DataFrame的区别 DataFrame与RDD的主要区别在 ...
- 前端jQuery日历控件报错 $("#datepicker").datepicker is not a function
使用日历控件时,前端产生错误: $("#datepicker").datepicker is not a function 问题原因 前端在同一个页面,jQuery引入了两次. 解 ...
- PYTHON 学习笔记2 流程控制工具以及函数定义、匿名函数
前言 在上一节的学习中.已经介绍了几种基本类型.包括字符串的定义,以及字符串中索引.切片.字符串拼接的使用方法.以及基本的整形数据运算.一些之前都没有了解过的运算符.比如 ** 乘方 //整数除法等. ...
- Java范型学习笔记
对于范型的使用或者说印象只有集合,其他地方即使使用过也不知道,反正就是只停留在List<E> Map<K, V>,最近刚好闲来无事,就找找资料学习一下:下列为个人学习总结,欢迎 ...
- javascript 获取两点的像素距离
getPosLen(sdot, edot){//获取2点距离 /* 56 40 56 40 00 40 56 40 56 */ return parseInt(Math.sqrt(Math.pow(M ...
- Keepalived 配置文件
keepalived的配置文件: keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs. 全局定义及 ...
- gcd综合
问题: 如果正整数大于了1000有什么影响? 1.递推式gcd: int gcd(int a,int b) { ) { int c=a%b; a=b; b=c; } return a; } 2.递归式 ...
- 来去学习之---KMP算法--next计算过程
一.概述 KMP算法是一种字符串匹配算法,比如现有字符串 T:ABCDABCDABCDCABCDABCDE, P:ABCDABCDE P字符串对应的next值:[0,0,0,0,1,2,3,4,0] ...