java实现单链表

抽烟

用java实现单链表

闲(bi)话(hua)少说,直接上源码

节点类

1
2
3
4
5
6
7
8
9
10
	public class Node {
String data;
Node next;
Node(String data)
{
this.data=data;
}
Node()
{}
}

上面这个类是定义了一个节点类,单链表都是由一个一个的节点组成的.

链表类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
	public class SingleLinkList {
// 建立头结点
Node header=new Node();
/*
* 插入节点的方法
* */
public void insertNode(Node InsNode)
{
// 搞一个临时变量,把头节点赋值给他
Node temp =header;
// 当没有到文件末尾就一直循环 temp.next是判断下一个还有没有节点,当循环退出就说明到了节点的末尾
while(temp.next!=null)
{
temp=temp.next;
}
// 现在将添加的节点放到节点的最后
temp.next=InsNode;
System.out.println("插入结束");
}
/*
* 删除节点的方法
* */
public void deleteNode(Node delNode)
{
// 搞一个临时变量,把头节点赋值给他
Node temp =header;
// 当没有到文件末尾就一直循环 temp.next是判断下一个还有没有节点,当循环退出就说明到了节点的末尾
while(temp.next!=null)
{
// 下面是判断当前temp的下一个元素是否和我们要删除的节点一致 这里考虑为什么要比较temp的下一个节点
// 而不比较它本身
if(temp.next.data.equals(delNode.data))
{
// 如果一致的话将当前节点下一个节点改为temp.next.next;
temp.next=temp.next.next;
System.out.println("删除结束");
// 跳出循环体,没有必要再往下面进行了,已经找到了
break;
}else
{
// 对temp重新赋值 进行下一轮的循环
temp=temp.next;
}

}

}
/*
* 下面是查找某个节点的方法
* */

public Node getNode(int i)
{
Node reNode=new Node();
// 搞一个临时变量,把头节点赋值给他
if(i<0||i>size())
{
System.out.println("您输入的节点位置不对");
}else {
int count=0;
Node temp =header;
while(temp.next!=null)
{
count++;
if(i==count)
{
reNode.data=temp.next.data;
break;
}else {
temp=temp.next;
}

}
}
return reNode;
}
/*
* 下面这个方法是修改链表中的数据
* */
public void updateNode(String oldData,String newData)
{
// 搞一个临时变量,把头节点赋值给他
Node temp =header;
// 当没有到文件末尾就一直循环 temp.next是判断下一个还有没有节点,当循环退出就说明到了节点的末尾
while(temp.next!=null)
{
// 下面是判断当前temp的下一个元素是否和我们要更新的节点一致
if(temp.next.data.equals(oldData))
{
// 如果一致的话,更新数据,如果这里是比较temp的data的话,会造成空指针
// 异常,因为头结点没有data,想改进的自己想想办法.
temp.next.data=newData;
System.out.println("更新结束");
// 跳出循环体,没有必要再往下面进行了,已经更新好了
return;
}else
{
// 对temp重新赋值 进行下一轮的循环
temp=temp.next;
}
}
System.out.println("此链表中没有你要的节点");
}
/*
* size方法是统计这个链表有多少个节点
* */
public int size()
{
Node temp = header;
int size=0;
while(temp.next!=null)
{
size++;
temp=temp.next;
}
return size;
}
/*
* 打印链表
* */
public void printList()
{
System.out.print("打印链表:");
Node temp =header;
while(temp.next!=null)
{
temp=temp.next;
System.out.print(temp.data+"\t");
}
System.out.println();
}
}

上面这个类是定义一个链表类,这里面定义了一些方法,用来对链表的操作,比作增加节点,打印链表,删除节点等等,本来想弄一个批量添加的节点的类的,但是出了点小问题,没弄上.

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
	public class LinkTest {
public static void main(String[] args)
{
SingleLinkList list=new SingleLinkList();
Node n1=new Node("a");
Node n2=new Node("b");
Node n6=new Node("c");
Node n3=new Node("d");
Node n4=new Node("e");
Node n5=new Node("f");
list.insertNode(n1);
list.insertNode(n2);
list.insertNode(n3);
list.insertNode(n4);
list.insertNode(n5);
list.insertNode(n6);
list.printList();
list.deleteNode(n1);
list.printList();
System.out.println(list.getNode(3).data);
list.updateNode("m","y");
list.updateNode("b", "m");
list.printList();
System.out.println("链表的长度为:"+list.size());
}
}

上面这个类是测试类,用来测试我们增加节点,删除节点的类.

测试结果

结果

咦~~~~ 这是嘛呀!!!
0%