写在前面,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,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。

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

最新文章

  1. 去年做了什么?OA。
  2. Oracle:从SQL文件批量导入数据
  3. Android项目实战(二十七):数据交互(信息编辑)填写总结
  4. 【HDU】4405 Aeroplane chess
  5. comparing-html5-mobile-ui-frameworks
  6. java基础之Java变量命名规范
  7. FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决的方法
  8. 自制单片机之十八……无线通讯模块NRF24L01+
  9. [js高手之路]node js系列课程-图解express+supervisor+ejs用法
  10. 【Java学习笔记之十四】Java中this用法小节
  11. spring开启事务时启动报错SAXParseException
  12. [Spark RDD_1] RDD 基本概念
  13. NSDictionary实现原理-ios哈希hash和isEqual
  14. vmware:Could not open /dev/vmmon: No such file or directory.
  15. IE 此网站的某个加载项无法运行
  16. android 避免线程的重复创建(HandlerThread、线程池)
  17. 更改MyEclipse中的src目录的浏览方式
  18. 解决IIS动态内容压缩的问题
  19. ps换衣服
  20. 我们为什么要在 PHPStorm 中标记目录

热门文章

  1. BZOJ2038 小Z的袜子(莫队之源)
  2. SSL公钥证书传递进行隐匿传输数据
  3. Vue项目使用vant框架
  4. VFP获取 SQL Server 的数据表、触发器、存储过程、视图等脚本
  5. Enum, Generic and Templates
  6. centos 7 设置 本地更新源
  7. zabbix-agentd配置文件详解
  8. ssh_key认证
  9. THINKPHP-RCE-POC
  10. npm/gulp/nodejs