写在前面,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,否则就等着被举报吧,尤其是那什么狗屁“金铭鼎”教育。
多有不足,欢迎评论区批评指正。