`
午刀十
  • 浏览: 33953 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

迭代器实现

阅读更多
      链表由一系列结点组成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。
     用链表实现迭代器:
class LinkIter
{

    public int      iData;
    public LinkIter next;

    public LinkIter(int data)
    {
        iData = data;
    }

    public void displayLink()
    {
        System.out.println(iData + " ");
    }
}

class LinkListIter
{

    public LinkIter first;

    public LinkListIter()
    {
        first = null;
    }

    public boolean isEmpty()
    {
        return first == null;
    }

    public LinkIter getFirst()
    {
        return first;
    }

    public void setFirst(LinkIter first)
    {
        this.first = first;
    }

    public void displayList()
    {
        LinkIter current = first;
        while (current != null)
        {
            current.displayLink();
            current = current.next;
        }
    }

    public ListIterator getIterator()
    {
        return new ListIterator(this);
    }
}

class ListIterator
{

    private LinkIter           current;
    private LinkIter           previous;
    private final LinkListIter ourList;

    public ListIterator(LinkListIter lnk)
    {
        ourList = lnk;
        reset();
    }

    public void reset()
    {
        current = ourList.getFirst();
        previous = null;
    }

    public boolean atEnd()
    {
        return current.next == null;
    }

    public void nextLink()
    {
        previous = current;
        current = current.next;
    }

    public LinkIter getLink()
    {
        return current;
    }

    //在当前结点后插入,先判断链表是否为空
    public void insertAfter(int dd)
    {
        LinkIter newLink = new LinkIter(dd);
        if(ourList.isEmpty())
        {
            ourList.setFirst(newLink);
            current = newLink;
        }
        else
        {
            newLink.next = current.next;
            current.next = newLink;
            nextLink();
        }
    }

    //在当前结点前插入,判断是否是首结点
    public void insertBefore(int dd)
    {
        LinkIter newLink = new LinkIter(dd);
        if(previous == null)
        {
            newLink.next = ourList.getFirst();
            ourList.setFirst(newLink);
            reset();
        }
        else
        {
            newLink.next = previous.next;
            previous.next = newLink;
            nextLink();
        }
    }

    //删除当前结点,判断是否是首结点
    public int deleteCurrent()
    {
        int data = current.iData;
        if(previous == null)
        {
            ourList.setFirst(current.next);
            reset();
        }
        else
        {
            previous.next = current.next;
            if(atEnd())
                reset();
            else
                current = current.next;
        }
        return data;
    }


注:以上代码均出自 JAVA数据结构与算法 第二版
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics