本文实例讲述了java数据结构之链表、栈、队列、树的实现方法。分享给大家供大家参考,具体如下:
最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查。
一、线性表(链表)
1、节点定义
1
2
3
4
5
6
7
8
9
10
11
|
/**链表节点定义
* @author colonel
*
*/
class node {
public int data;
node next= null ;
public node( int data){
this .data=data;
}
}
|
2、链表操作类
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
|
/**链表操作类
* @author colonel
*
*/
public class operateclass {
public node headnode= null ;
/*给链表添加界节点
* @param data 链表节点数据
*/
public node addnode(int data){
node newnode=new node(data);
if (headnode==null) {
headnode=newnode;
newnode.next=null;
return headnode;
}
node tempnode=headnode;
while (tempnode.next!=null) {
//tempnode=headnode;
tempnode=tempnode.next;
}
tempnode.next=newnode;
return headnode;
}
/**删除节点
* @param 删除节点的位置
*
*/
public boolean delnode(int index){
if (index<1||index>length()) {
return false;
}
if (index==1) {
headnode=headnode.next;
return true;
}
node prenode=headnode;
node curnode=prenode.next;
int count=2;
while (curnode!=null) {
if (count==index) {
prenode.next=curnode.next;
return true;
}
prenode=curnode;
curnode=curnode.next;
count++;
}
return true;
}
/**取链表的长度
* @return返回链表的长度
*/
public int length(){
int length=0;
node temp=headnode;
while (temp!=null) {
length++;
temp=temp.next;
}
return length;
}
/**按照值域对链表数据排序
* @return 返回排序后的链表头节点
*/
public node orderlist(){
node nextnode=null;
int temp=0;
node curnode=headnode;
while (curnode.next!=null) {
nextnode=curnode.next;
while (nextnode!=null) {
if (curnode.data>nextnode.data) {
temp=curnode.data;
curnode.data=nextnode.data;
nextnode.data=temp;
}
nextnode=nextnode.next;
}
curnode=curnode.next;
}
return headnode;
}
/**
* 去除链表中值域重复的元素
*/
public void redrepeat(){
if (length()<=1) {
return;
}
node curnode=headnode;
while (curnode!=null) {
node insidnode=curnode.next;
node insidprenode=insidnode;
while (insidnode!=null) {
if (insidnode.data==curnode.data) {
insidprenode.next=insidnode.next;
//return;
}
insidprenode=insidnode;
insidnode=insidnode.next;
}
curnode=curnode.next;
}
}
/**倒序输出链表中所有的数据
* @param hnode 链表头节点
*/
public void reverseprint(node hnode){
if (hnode!=null) {
reverseprint(hnode.next);
system.out.println(hnode.data);
}
}
/**
* 从头节点开始到为节点结尾打印出值
*/
public void printlist(){
node tmpnode=headnode;
while (tmpnode!= null ) {
system.out.println(tmpnode.data);
tmpnode=tmpnode.next;
}
}
}
|
二、栈
1、该栈使用数组实现,具体的栈操作类
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
|
class mystack<e>{
private object[] stack;
int top=- 1 ;
public mystack(){
stack= new object[ 10 ];
}
public boolean isempty(){
return top== 0 ;
}
/**弹出栈顶元素(不删除)
* @return
*/
public e peek(){
if (isempty()) {
return null ;
}
return (e) stack[top];
}
/**出栈站顶元素
* @return 栈顶元素
*/
public e pop(){
e e=peek();
stack[top]= null ;
top--;
return e;
}
/**压栈
* @param item 待压元素
* @return 返回待压元素
*/
public e push(e item){
//ensurecapacity(top+1);
stack[++top]=item;
return item;
}
/**栈满扩容
* @param size
*/
public void ensurecapacity( int size){
int len=stack.length;
if (size>len) {
int newlen= 10 ;
stack=arrays.copyof(stack, newlen);
}
}
/**返回栈顶元素
* @return
*/
public e gettop(){
if (top==- 1 ) {
return null ;
}
return (e) stack[top];
}
}
|
三、队列
该队列使用链式实现
1、队节点定义
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* @author colonel
*队节点定义
* @param <elem>
*/
class queuenode<elem>{
queuenode<elem> nextnode= null ;
elem data;
public queuenode(elem data){
this .data=data;
}
}
|
2、队列操作类
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
|
/**
* @author colonel
*队列操作类
* @param <elem>
*/
class myqueue<elem>{
private queuenode<elem> headnode= null ;
private queuenode<elem> tailnode= null ;
private queuenode<elem> lastnode= null ;
/**判断该队列是否为空
* @return 返回true or false
*/
public boolean isempty(){
return headnode==tailnode;
}
/**入队操作
* @param data 节点元素值
*/
public void put(elem data){
queuenode<elem> newnode= new queuenode<elem>(data);
if (headnode== null &&tailnode== null ) {
headnode=tailnode=newnode;
//tailnode=headnode.nextnode;
lastnode=tailnode.nextnode;
return ;
}
tailnode.nextnode=newnode;
tailnode=newnode;
lastnode=tailnode.nextnode;
//tailnode=tailnode.nextnode;
}
/**出队操作
* @return 返回出队元素
*/
public elem pop(){
if (headnode==lastnode) {
return null ;
}
queuenode<elem> tempnode=headnode;
elem statelem=tempnode.data;
headnode=tempnode.nextnode;
return statelem;
}
/**返回队列长度
* @return 长度
*/
public int size(){
if (isempty()) {
return 0 ;
}
int length= 0 ;
queuenode<elem> temp=headnode;
while (temp!= null ) {
length++;
temp=temp.nextnode;
}
return length;
}
}
|
四、二叉树
1、节点定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**树节点定义
* @author colonel
*
*/
class treenode{
public int data;
public treenode leftnode;
public treenode rightnode;
public treenode( int data){
this .data=data;
this .leftnode= null ;
this .rightnode= null ;
}
}
|
2、二叉树操作类
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
|
/**二叉排序树操作类
* @author colonel
*
*/
class operatetree{
public treenode rootnode;
public operatetree(){
rootnode= null ;
}
/**元素插入二叉排序树
* @param data 待插节点数据
*/
public void insert( int data){
treenode newnode= new treenode(data);
if (rootnode== null ) {
rootnode=newnode;
} else {
treenode current=rootnode;
treenode parent;
while ( true ) {
parent=current;
if (data<current.data) {
current=current.leftnode;
if (current== null ) {
parent.leftnode=newnode;
return ;
}
} else {
current=current.rightnode;
if (current== null ) {
parent.rightnode=newnode;
return ;
}
}
}
}
}
/**构建二叉排序树
* @param item 元素数组
*/
public void buildtree( int [] item){
for ( int i = 0 ; i < item.length; i++) {
insert(item[i]);
}
}
/**
* 先序遍历二叉树
*/
public void preorder(treenode root){
if (root!= null ) {
system.out.println(root.data);
preorder(root.leftnode);
preorder(root.rightnode);
}
}
/**中序遍历
* @param root
*/
public void inorder(treenode root){
if (root!= null ) {
inorder(root.leftnode);
system.out.println(root.data);
inorder(root.rightnode);
}
}
/**后序遍历
* @param root
*/
public void afterorder(treenode root){
if (root!= null ) {
afterorder(root.leftnode);
afterorder(root.rightnode);
system.out.println(root.data);
}
}
/**
* 层序遍历二叉排序树
*/
public void layertrave(){
if ( this .rootnode== null ) {
return ;
}
queue<treenode> myqueue= new linkedlist<>();
myqueue.add(rootnode);
while (!myqueue.isempty()) {
treenode tempnode=myqueue.poll();
system.out.println(tempnode.data);
if (tempnode.leftnode!= null ) {
myqueue.add(tempnode.leftnode);
}
if (tempnode.rightnode!= null ) {
myqueue.add(tempnode.rightnode);
}
}
}
|
五、总结
更好的理解数据结构为何物,还需继续探索,谨记。by:colonel
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/sinat_34322082/article/details/53694315