码迷,mamicode.com
首页 > 其他好文 > 详细

SingleLinkedList独立实现,无任何依赖包

时间:2015-08-11 18:43:10      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:数据结构   单链表   链表   源码   class   

现在对Java原生数据结构特感兴趣,于是决定自己动手实现一些类,比如这个List类,在熟习了单链表和双链表的数据结构之后,终于实现了,代码如下:
源码SingleLinkedList.java
package hk.inso.service;

/**
 * Created by IntelliJ IDEA.
 * Date: 8/10/15 6:09 PM
 * Author: Richard
 */
public class SingleLinkedList<E> {

    private static class Node<E> {

        private element;
        private Node next;

        public Node(element) {
            //constructor with args
            this.element = element;
        }

        public Node() {
            //constructor without args
        }

        @Override
        public String toString() {
            return element.toString();
        }
    }

    private Node first;
    private Node last;

    /**
     * 添加元素到链表头部
     * @param element
     */
    public void add(element) {
        Node<E> node = new Node<E>(element);
        linkFirst(node);
    }
    /**
     * 添加元素到链表尾部
     * @param element
     */
    public void addLast(element) {
        Node<E> node = new Node<E>(element);
        linkLast(node);
    }

    /**
     * 根据索引移除元素
     * @param index
     */
    public void remove(int index) {
        if (index == 0) {
            unlinkFirst();
        }
        else{
            Node node = getNode(index);
            unlink(node);
        }

    }

    /**
     * 移除链表中最后一个元素
     */
    public void removeLast() {
        unlinkLast();
    }

    /**
     * 将元素插入指定链表索引为止
     * @param index
     @param element
     */
    public void insert(int index, element) {
        Node<E> node1 = new Node<E>(element);
        if(index == 0) {
            linkFirst(node1);
        } else {
            Node node2 = getNode(index);
            link(node1, node2);
        }
    }

    /**
     * 获取某个元素
     * @param index
     @return
     */
    public get(int index) {
        Node<E> node = getNode(index);
        element = node.element;
        return element;
    }

    /**
     * 统计链表里面所有元素的个数
     * @return 总的元素的个数
     */
    public int size() {
        int count = 0;
        Node node = first;
        while (node != null) {
            count++;
            node = node.next;
        }
        return count;
    }

    /**
     * toString方法实现
     * @return
     */
    @Override
    public String toString() {
        Node node = first;
        StringBuilder stringBuilder = new StringBuilder();
        if(node == null) {
            return "{}";
        }
        while (node != null) {
            stringBuilder.append("[" + node.element.toString() +"],");
            node = node.next;
        }
        String result = stringBuilder.toString();
        int index = result.lastIndexOf(",");
        return result.substring(0, index);

    }

    /**
     * 插入结点到链表中间
     * 插入前
     * node2->node3->node4
     * 插入后
     * node2->node1->node3->node4
     * @param node1 要插入的结点
     * @param node2 插入结点位置结点
     */
    private void link(Node node1, Node node2) {
        node1.next = node2;
        Node prevNode = getPrevNode(node2);
        prevNode.next = node1;
    }

    /**
     * 插入结点到链表首部
     * @param node
     */
    private void linkFirst(Node node) {

        if(first == null || last == null) {
            first last = node;
        } else {
            node.next first;
            first = node;
        }

    }

    /**
     * 插入结点到链表尾部
     * @param node
     */
    private void linkLast(Node node) {
        last.next = node;
        last = node;
    }

    /**
     * 从链表中间移除当前结点
     * @param node
     */
    private void unlink(Node node) {
        Node prevNode = getPrevNode(node);
        prevNode.next = node.next;
    }

    /**
     * 移除头部的结点
     */
    private void unlinkFirst() {
        first first.next;
    }

    /**
     * 移除尾部的结点
     */
    private void unlinkLast() {
        Node prevNode = getPrevNode(last);
        prevNode.next null;
        last = prevNode;
    }

    /**
     * 寻找当前结点的前一个结点
     * @param node 当前结点
     * @return
     */
    private Node getPrevNode(Node node) {
        //这里多走了一步
        // Node nodeItr = first.next;
        Node nodeItr = first;
        Node prevNode = new Node();
        while (!nodeItr.equals(node)) {
            prevNode = nodeItr;
            nodeItr = nodeItr.next;
        }
        return prevNode;
    }

    /**
     * 根据索引查找链表中得数据
     * @param index
     @return 链表结点
     */
    private Node getNode(int index) {
        Node node = first;
        Node currentNode = new Node();
        if (index == 0) {
            //continue
        }

        if (index >= size()) {
            throw new IndexOutOfBoundsException(errMessage(index));
        }
        else {
            int i = 0;
            while (i <= index) {
                if(node != null) {
                    currentNode = node;
                    //注意这里有递增
                    node = node.next;
                }
                i++;
            }
        }
        return currentNode;
    }

    /**
     * 错误消息显示
     * @param index
     @return
     */
    private String errMessage(int index) {
        return "Size: "+ size() + ", index: "+ index;
    }

}
测试方法TestSingleLinkedList.java
package hk.inso.test;

import hk.inso.service.SingleLinkedList;

/**
 * Created by IntelliJ IDEA.
 * Date: 8/11/15 4:58 PM
 * Author: Richard
 */
public class TestSingleLinkedList {

    public static void main(String[] args) {

        SingleLinkedList<User> list = new SingleLinkedList<User>();
        list.add(new User(5"Jimmy""Girl"));
        list.add(new User(7"Tom""Boy"));
        list.addLast(new User(6"Amy""Girl"));
        System.out.println(list.toString());
    }
}

class User {

    private int age;
    private String name;
    private String gender;

    public User(int age, String name, String gender) {
        this.age = age;
        this.name = name;
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" age +
                ", name=‘" name \‘‘ +
                ", gender=‘" gender \‘‘ +
                ‘}‘;
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

SingleLinkedList独立实现,无任何依赖包

标签:数据结构   单链表   链表   源码   class   

原文地址:http://blog.csdn.net/u011763190/article/details/47424221

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!