Java学习小技巧,巧妙实现sunziren的单向链表

在这里插入图片描述

最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚。于是打算把链表这一块好好的学习学习。在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接。
  于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节点方法,deleteById按指定下标删除结点方法,showAll控制台查看所有元素方法,reverse反转当前链表方法,length获取当前链表长度方法,等基本方法。
  需要说明的是,这个类还有很多不足之处,它还有很多需要改进的地方。但是基本原理和单向链表是相同的,仅供参考。
  
1 package demo_4;
2
3 import java.util.Stack;
4
5 public class MyList<Re_Helix> {
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 }

文章来自:https://www.itjmd.com/news/show-5345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值