博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单向链表的简单Java实现-sunziren
阅读量:4652 次
发布时间:2019-06-09

本文共 4385 字,大约阅读时间需要 14 分钟。

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


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

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

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

1 package demo_4;  2    3 import java.util.Stack;  4    5 public class MyList
{ 6 //节点内部类; 7 private class Node{ 8 private Re_Helix data; //数据; 9 private Node next = null; //下个节点的引用; 10 11 public Node() { //节点的无参构造; 12 super(); 13 } 14 15 public Node(Re_Helix data) { //节点的有参构造; 16 super(); 17 this.data = data; 18 } 19 } 20 21 private Node head; //头部节点; 22 private Node end; //尾部节点; 23 private Node point; //临时节点; 24 private int length; //长度属性; 25 26 public MyList() { //链表的无参构造; 27 head = new Node(); 28 end = head; 29 length = 0; 30 } 31 32 public void input(Re_Helix data) { //给链表插入新值; 33 point = new Node(data); 34 if(length==0) { 35 end.data = point.data; 36 }else { 37 end.next = point; 38 end = point; 39 } 40 length++; 41 } 42 43 public void inputById(int target,Re_Helix data) { //在指定下标的位置插入新值,如果两端超出范围,则分别按照head和end处理; 44 Node temp = new Node(data); 45 if(target>=length) { 46 end.next = temp; 47 end = temp; 48 }else if(target<=0) { 49 temp.next = head; 50 head = temp; 51 }else { 52 temp.next = packPoint(target); 53 packPoint(target-1).next = temp; 54 } 55 length++; 56 } 57 58 public int length() { //返回链表的长度; 59 return length; 60 } 61 62 public Re_Helix getById(int target) { //输入下标返回值; 63 return packPoint(target).data; 64 } 65 66 public void showAll() { //在控制台查看当前链表中的所有数据 67 point = head; 68 int i = 0; 69 while(point!=null) { 70 System.out.println("第"+(i++)+"个:"+point.data); 71 point = point.next; 72 } 73 } 74 75 public void reverse() { //将链表反转; 76 Stack
s1 = new Stack
(); //利用队列的先进先出的特性; 77 point = head; 78 while(point!=null) { 79 s1.push(point); 80 point = point.next; 81 } 82 head = s1.pop(); 83 point = head; 84 while(!s1.isEmpty()) { 85 point.next = s1.pop(); 86 point = point.next; 87 } 88 end = point; 89 end.next = null; //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环; 90 } 91 92 public void deleteById(int target) { //输入下标删除值 93 if(target>0) { 94 packPoint(target-1).next = packPoint(target).next; 95 }else { 96 head = head.next; 97 } 98 length--; 99 }100 101 public void deleteAll() { //清空链表;102 length = 0;103 head.data = null;104 head.next = null;105 point = null;106 end = head; 107 System.gc();108 }109 110 public boolean editById(int target,Re_Helix data) { //修改传入下标位置的值;111 if(target<0 || target>length) {112 return false;113 }else {114 packPoint(target).data = data;115 return true;116 }117 }118 119 private Node packPoint(int target) { //内部方法,将指针指向指定下标的节点;120 if(target<=0) {121 point = head;122 }else if(target>=length) {123 point = end;124 }else {125 int i = 0;126 point = head;127 while(i++!=target) {128 point = point.next;129 }130 }131 return point;132 }133 }

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

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

 

转载于:https://www.cnblogs.com/sunziren/p/10254481.html

你可能感兴趣的文章
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>
JavaScript中的原型继承原理
查看>>
Python logger模块
查看>>
jquery控制css的display(控制元素的显示与隐藏)
查看>>
关于python做人工智能的一个网页(很牛逼)
查看>>
判断控件的CGRect是否重合,获取控件的最大XY值
查看>>
POJ-1128 Frame Stacking
查看>>
python第三十九课——面向对象(二)之初始化属性
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
JavaScript 复杂判断的更优雅写法借鉴
查看>>
<mvc:annotation-driven/>浅析
查看>>
ArcEngine开发之自定义工具
查看>>
SQL视频总结
查看>>
P4878 道路修建-美国
查看>>
dp练习
查看>>
vim
查看>>