【算法导论学习-20】单链表(single linked)的实现

来源:互联网 发布:田岛美工刀片价格 编辑:程序博客网 时间:2024/06/12 19:37

参考:http://www.jb51.net/article/48164.htm

1、节点类的实现

<pre name="code" class="java">public class Node<E> { // 节点类    E data; // 节点上的数据    Node<E> next; // 指向下一个节点    Node(E e) {        data = e;        next = null;    }}


关于节点类的说明:

    java中没有指针的概念,设计Node需要一点技巧:Node<E>类的成员变量 Node<E> next,初始化用 next=null,否则该类在实例化的时候无法保证类的自包含性。
 例如,Node<E> node=new Node<E>(null);表示设计出来了这样一个类:

2、单链表的实现

注意:这里将第一个节点作为头指针,而“参考:http://www.jb51.net/article/48164.htm”没有头指针。

public class SinglyLinkedList<E> {    private Node<E> preHNodeead; // 链表的头指针,为null,指向第一个结点(头结点)    private Node<E> last; // 链表的尾节点    private Node<E> other = null;    private int length = 0; // 节点数量    public int getLength() {        return length;    }    /**     * 无参构造方法,构造了一个仅包含空的头指针的单链表,长度仍为零     */    public SinglyLinkedList() {        // 默认节点为空        preHNodeead = new Node<E>(null);    }    /* 将头指针指向结点Node<E> node */    public void setPreHeadNext(Node<E> node) {        preHNodeead.next = node;    }    /* 获取头指针 */    public Node<E> getPreHead() {        return preHNodeead;    }    /**     * 添加一个节点(尾插法)     *     * @param data     *            数据     */    public void add(E data) {        if (isEmpty()) {            last = preHNodeead;        }        Node<E> newNode = new Node<E>(data);        last.next = newNode;        last = newNode;        length++;    }
/**<span style="white-space:pre"></span> * 添加一个节点(尾插法)<span style="white-space:pre"></span> * <span style="white-space:pre"></span> * @param node<span style="white-space:pre"></span> *            结点<span style="white-space:pre"></span> */<span style="white-space:pre"></span>public void add(Node<E> node) {<span style="white-space:pre"></span>if (isEmpty()) {<span style="white-space:pre"></span>last = preHNodeead;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>last.next = node;<span style="white-space:pre"></span>last=node;<span style="white-space:pre"></span>length++;<span style="white-space:pre"></span>}    /**     * 判断链表是否为空     *     * @return 空为true,非空为false     */    public boolean isEmpty() {        return length == 0;    }     /**     * 清空链表     */    public void clear() {        preHNodeead = null;        length = 0;    }    /**     * 输出所有节点     */    public void printLink() {        if (isEmpty()) {            System.out.println("空链表");        } else {            other = preHNodeead;            while (other != null) {                System.out.print(other.data + "→");                other = other.next;            }            System.out.println();        }    }}



0 0