`
landyer
  • 浏览: 138902 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

带头结点的单链表类

    博客分类:
  • java
 
阅读更多

//带头结点的单链表类
//建议,不声明成员变量rear和n,不安全,维护困难,子类需要同时修改3个成员变量,易出错。

package dataStructure.linearList;
import dataStructure.linearList.Node;            //导入单链表结点类
import java.util.Iterator;                       //导入迭代器接口

public class HSLinkedList<E> extends AbstractList<E> implements LList<E> //带头结点的单链表类,实现线性表接口
{
    protected Node<E> head;                      //头指针,指向单链表的头结点
    protected Node<E> rear;                  	 //尾指针,指向单链表最后一个结点
    protected int n;                             //单链表长度

    public HSLinkedList()                        //构造空链表
    {
        this.head = new Node<E>();               //创建头结点,值为null
        this.rear = this.head;
        this.n=0;
    }
    
    
    public boolean isEmpty()                     //判断单链表是否为空,O(1)
    {
        return this.head.next==null;
    }
    public int length()                          //返回单链表长度,O(1)
    {
        return this.n;
    }


    public E get(int index)                      //返回序号为index的对象,index初值为0
    {                                            //若单链表空或序号错误返回null,O(n)
        if (index>=0)
        {
            int j=0; 
            Node<E> p=this.head.next;
            while (p!=null && j<index)
            {
                j++;
                p = p.next;
            }
            if (p!=null)
                return (E)p.data;
        }
        return null;
    }
   
    public E set(int index, E element)           //设置序号为index的对象为element,O(n)
    {                                            //若操作成功返回原对象,否则返回null
        if (index>=0 && element!=null)
        {
            int j=0; 
            Node<E> p=this.head.next;
            while (p!=null && j<index)
            {
                j++;
                p = p.next;
            }
            if (p!=null)
            {
                E old = (E)p.data;
                p.data = element;
                return old;                      //若操作成功返回原对象
            }
        }
        return null;                             //操作不成功
    }

    public boolean add(E element)                //在单链表最后添加对象,O(1)
    {
        if (element==null)
            return false;
                                         
        this.rear.next = new Node<E>(element);   //尾插入
        this.rear = this.rear.next;              //移动尾指针
        this.n++;
        return true;
    }

    public boolean add(int index, E element)     //在指定位置插入非空的指定对象
    {                                            //若操作成功返回true,O(n)
        if (element==null)
            return false;

        if (index>=this.n)
            return this.add(element);            //插入在最后
        else
        {
            int j=0;
            Node<E> p = this.head;
            while (p.next!=null && j<index)      //若index<=0,插入在头结点之后
            {
                j++;
                p = p.next;
            }
            p.next=new Node<E>(element, p.next); //插入在p结点之后,包括头插入、中间插入
            this.n++;
            return true;
        }
    }

    public E remove(int index)                   //移去index位置的对象,O(n)
    {                                            //若操作成功返回被移去对象,否则返回null
        E old = null;
        if (index>=0)                            //头删除、中间/尾删除
        {
            int j=0; 
            Node<E> p=this.head;
            while (p.next!=null && j<index)      //定位到待删除结点的前驱结点
            {
                j++;
                p = p.next;
            }
            if (p.next!=null)
            {
                old = (E)p.next.data;
                if (p.next==this.rear)
                    this.rear=p;
                p.next = p.next.next;            //删除p的后继结点
                this.n--;
            }
        }
        return old;
    }

    public void clear()                          //清空单链表,O(1)
    {
        this.head.next = null;
        this.rear = this.head;
        this.n=0;
    }

    public String toString()                     //返回显示单链表所有元素值对应的字符串
    {                                            //单链表遍历算法,O(n)
        String str="(";
        Node<E> p = this.head.next;
        while (p!=null) 
        {
           str += p.data.toString();
           p = p.next;
           if (p!=null) 
              str += ", ";
        }
        return str+")";
    }
    //以上实现LList接口



    public Iterator<E> iterator()                //返回一个迭代器对象
    {
        return new Itr();
    }

    private class Itr implements Iterator<E>     //私有内部类,实现迭代器接口
    {
        private Node<E> cursor = head.next;

        public boolean hasNext()                 //若有后继元素,返回true
        {
            return cursor!=null && cursor.next!=null;
        }

        public E next()                          //返回后继元素
        {
            if (cursor != null && cursor.next!=null)
            {
                E element = cursor.next.data;
                cursor = cursor.next;
                return element;
            }
            return null;
        }

        public void remove()                     //不支持该操作
        {
            throw new UnsupportedOperationException();
        }
    }//内部类Itr结束

    public static void main(String args[])
    {
        HSLinkedList<String> list = new HSLinkedList<String>();
        for (int i=5; i>=0; i--)
            list.add(0,new String((char)('A'+i)+""));
        System.out.println(list.toString());
    }
}



/*
程序运行结果如下:    
(A, B, C, D, E, F)


*/
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics