Java实现单链表数据结构

这两天翻了下大二学习的数据结构教材,因为是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);
        }


        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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值