您的位置:首页 > 理论基础 > 数据结构算法

Java实现单链表数据结构

2015-03-31 23:37 417 查看
这两天翻了下大二学习的数据结构教材,因为是C++版的,看完线性表的连接存储结构—单链表,用C++实现不是很难。因为学习了java,所以就思考着如何用java实现单链表。但是C++使用的是指针,而Java实际上没有指针,但是Java有引用,实际上能用Java模拟实现单链表,而且个人感觉比C++还容易实现些。

c++使用的是结构体模拟结点,Java这里使用类模拟了一个结点。为方便访问数据域权限全部公有

class Node {
public Data data;// 结点的数据域
public Node next;// 保存下一个结点

/**
* 头结点初始化为null
*/
public Node() {
this.next = null;// 单独的一个节点
}

public Node(Data data) {
this.data = data;// 实例化数据域
}
}


为方便测试,定义一个类封装数据,同样使用最大访问权限

class Data {
public int key;// 关键码
public String prop;

public Data(int key, String prop) {
this.key = key;
this.prop = prop;
}

public String toString() {
return "Data[" + key + "," + prop + "]";
}
}


定义一个链表操作类封装全部操作,包括建立链表,计算链表长度,遍历,插入删除节点等。源码如下:

package linklist;

/**
* 测试数据类
*
* @author xuyao
* @version V1.0
* @Date 2015年3月31日 下午11:17:53
*/
class Data { public int key;// 关键码 public String prop; public Data(int key, String prop) { this.key = key; this.prop = prop; } public String toString() { return "Data[" + key + "," + prop + "]"; } }

/**
* 一个节点类,封装了数据域和下一个结点
*
* @author xuyao
* @version V1.0
* @Date 2015年3月31日 下午2:45:27
*/
class Node { public Data data;// 结点的数据域 public Node next;// 保存下一个结点 /** * 头结点初始化为null */ public Node() { this.next = null;// 单独的一个节点 } public Node(Data data) { this.data = data;// 实例化数据域 } }

class LinkList {
public Node first;

public LinkList() {
first = new Node();// 初始化一个空链表
}

/**
* 头插法建立单链表
*
* @param data
*/
public void createList(Data data) {
// 建立一个节点
Node node = new Node(data);
node.next = first.next;
first.next = node;
}

/**
* 遍历单链表
*/
public void iterator() {
Node p = first.next;
Data data = null;
while (p != null) {
data = p.data;
System.out.println(data);
p = p.next;
}
}

/**
* 在执行的key值之间插入结点
*
* @param data
* 结点的数据
* @param key
* 执行插入位置
*/
public void insertNode(Data data, int key) {
Node p = first.next;// 工作指针指向表头
while (p != null && p.data.key != key) {// 如果一直没有发现
p = p.next;
}
// 遍历完成却没有发现插入位置
if (p == null)
throw new RuntimeException("未找到插入位置");
// 现在已找到插入点
Node node = new Node(data);
node.next = p.next;
p.next = node;
}

/**
* 删除指定key的值
*
* @param key
* @return
*/
public Data deleteNode(int key) {
Node p = first.next;// 设置工作指针
Node q = first;// 设置前驱结点
while (p != null) {
if (p.data.key == key) {
q.next = p.next;// 摘除结点
return p.data;
} else {
q = p;
p = p.next;
}
}
return null;
}

/**
* 计算单链表的长度
*
* @return
*/
public int length() {
Node p = first.next;
int count = 0;// 计数器,初始化为0;
while (p != null) {
p = p.next;
count++;
}
return count;
}
}

public class LinkedListTest {
public static void main(String[] args) {
Data data = null;
LinkList link = new LinkList();
// 建立一个10个元素的链表
for (int i = 0; i < 9; i++) {
data = new Data(i, "test" + i);
link.createList(data);
b0f7
}

System.out.println("===开始测试是否建立链表是否成功===");
// 遍历单链表
link.iterator();

System.out.println("===开始测试是否插入成功===");
Data insert = new Data(22, "insert");
link.insertNode(insert, 5);
link.iterator();

System.out.println("单链表的长度:" + link.length());

System.out.println("===开始测试是否删除成功===");
System.out.println("被删除结点元素的值:" + link.deleteNode(6));

System.out.println("单链表的长度:" + link.length());
}
}


运行结果:

===开始测试是否建立链表是否成功===
Data[8,test8]
Data[7,test7]
Data[6,test6]
Data[5,test5]
Data[4,test4]
Data[3,test3]
Data[2,test2]
Data[1,test1]
Data[0,test0]
===开始测试是否插入成功===
Data[8,test8]
Data[7,test7]
Data[6,test6]
Data[5,test5]
Data[22,insert]
Data[4,test4]
Data[3,test3]
Data[2,test2]
Data[1,test1]
Data[0,test0]
单链表的长度:10
===开始测试是否删除成功===
被删除结点元素的值:Data[6,test6]
单链表的长度:9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息