0

这是我在这里的第一篇文章,但我对这个网站并不陌生(称我为潜伏者)。不幸的是,这一次我似乎无法在不问的情况下找到我的问题的答案。总之,说到点子上了。

我正在用 Java 编写一个小蛇和梯子(又名滑槽和梯子)程序,用于数据结构课程。我必须编写自己的 Linked List (LL) 类,(我知道有一个 java util 做得更好,但我必须了解数据结构的工作原理),这不是问题。我喜欢称它为“半双链接”,因为它向前链接,但有另一个用于其他链接的指针字段,这不一定在每个节点中都使用。

我想知道的是是否可以将一个节点从一个列表链接到另一个不同类型的列表。糟糕的例子:(例如)如何将一个类型的节点链接到一个类型的节点?假设我们有 7 个 int 值 [1,2,3,4,5,6,7] 的 LL,以及 7 个字符串 [Monday, Tuesday, Wednesday,Thursday, Friday, Saturday, Sunday] 的 LL。我们想将包含 1 的节点链接到包含 Monday 的节点。

确切地说,我遇到的问题如下:我有 100 个节点前向链接,形成游戏板,以及 4 的循环链接列表。我想将玩家节点链接到他们各自在棋盘上的位置,这样当他们遍历棋盘时,他们也可以跟随“蛇”和“梯子”链接。

提前致谢!

我的 LLNode.java 和 LL.java 已附加。

// LLNode.java  
// node in a generic linked list class, with a link 

public class LLNode<T> 
{
    public T info;
    public LLNode<T> next, link;

    public LLNode()
    {   
        next = null;
        link= null;
    }

    public LLNode(T element)
    {
        info = element;
        next = null;
        link = null;
    }

    public LLNode(T element, LLNode<T> n)
    {
        info = element;
        next = n;
        link = null;
    }

    public T getInfo()
    {
        return info;
    }

    public void setInfo(T element)
    {
        info = element;
    }

    public LLNode<T> getNext()
    {
        return next;
    }

    public void setNext(LLNode<T> newNext)
    {
        next = newNext;
    }

    public LLNode<T> getLink()
    {
        return link;
    }

    public void setLink(LLNode<T> newLink)
    {
        link = newLink;
    }
}

// SLL.java 
// a generic linked list class

public class LL<T> 
{
    private LLNode<T> head, tail;
    public LLNode<T> current = head;

    public LL()
    {
        head = tail = null;
    }

    public boolean isEmpty()
    {
        return head == tail;
    }

    public void setToNull()
    {
         head = tail = null;
    }

    public boolean isNull()
    {
        if(head == tail)
            if(head == null || tail == null)
                return true;
            else 
                return false;
        else 
            return false;
    }

    public void addToHead(T element)
    {
        head = new LLNode<T>(element, head);
        if (tail == null)
            tail = head;
    }

    public void addNodeToHead(LLNode<T> newNode)
    {
        head = newNode;
        if (tail == null)
            tail = head;
    }

    public void addToTail(T element)
    {
        if (!isNull())
        {
            tail.next= new LLNode<T>(element);
            tail = tail.next;
        }
        else head = tail = new LLNode<T>(element);
    }

    public void addNodeToTail(LLNode<T> newNode)
    {
        if (!isNull())
        {
            tail.next= newNode;
            tail = tail.next;
        }
        else head = tail = newNode;
    }

    public void addBefore(T element, T X)
    {
        if (!isEmpty()) // Case 1
        {
            LLNode<T> temp, n;

            temp = head;
            while( temp.next != null )
            {
                if( temp.next.info == X )
                {
                    n = new LLNode<T>(element, temp.next);
                    temp.next = n;
                    return;
                }
                else 
                temp = temp.next;
            }    
        }
        else // Case 2
            head = new LLNode<T>(element, head);
    }

    public void addBefore(T element, LLNode<T> X)
    {
        if (!isEmpty()) // Case 1
        {
            LLNode<T> temp, n;

            temp = head;
            while( temp.next != null )
            {
                if( temp.next == X )
                {
                    n = new LLNode<T>(element, X);
                    temp.next = n;
                    return;
                }
                else 
                temp = temp.next;
            }    
        }
        else // Case 2
            head = new LLNode<T>(element, head);
    }

    public T deleteFromHead()
    {
        if (isEmpty())
            return null;
        T element = head.info;
        if (head == tail)
            head = tail = null;
        else head = head.next;
        return element;
    }

    public T deleteFromTail()
    {
        if (isEmpty())
            return null;
        T element = tail.info;
        if (head == tail)
            head = tail = null;
        else 
        {
            LLNode<T> temp;
            for (temp = head; temp.next != tail; temp = temp.next);
            tail = temp;
            tail.next = null;
        }
        return element;
    }

    public void delete(T element)
    {
        if (!isEmpty())
            if (head == tail && (element.toString()).equals(head.info.toString()))
                head = tail = null;
            else if ((element.toString()).equals(head.info.toString()))
                head = head.next;
        else 
        {
            LLNode<T> pred, temp;
            for (pred = head, temp = head.next; temp != null && !((temp.info.toString()).equals(element.toString())); pred = pred.next, temp = temp.next);
            if (temp != null)
                pred.next = temp.next;
            if  (temp == tail)
                tail = pred;
        }
    }

    public void listAll()
    {
        if(isNull())
            System.out.println("\tEmpty");
        else
        {
            for ( LLNode<T> temp = head; temp!= tail.next; temp = temp.next)
                System.out.println(temp.info);
        }
    }

    public LLNode<T> isInList(T element)
    {
        LLNode<T> temp;
        for ( temp = head; temp != null && !((temp.info.toString()).equals(element.toString())); temp = temp.next);
        return temp ;
    }

    public LLNode<T> getHead()
    {
        return head;
    }

    public LLNode<T> getTail()
    {
        return tail;
    }

    public LLNode<T> getCurrent()
    {
        return current;
    }

    public void incrementCurrent()
    {
        current = current.next;
    }

    public void followCurrentLink()
    {
        current = current.link;
    }
}
4

2 回答 2

1

您想要为节点对象的特定问题域泛型的任何具体原因?

如果您想获得这种效果,另一种方法可能是为节点对象提供一个接口(可能称为 ILinkNode),在两个不同的节点类中覆盖 getInfo 和 setInfo。然后 nodeLink 可以指向接口对象,而无需在代码中的任何地方进行特殊类型转换。

于 2012-08-20T21:42:53.847 回答
0

在第一个列表中使用,即包含要链接到另一个列表中的节点的节点的列表,Object 作为泛型类型实例化。

就像是:

    LL<Object> ll = new LL<Object>();

如果这样做,则每次从列表中检索节点的值时,都必须注意转换为特定类型。

于 2012-08-20T21:32:56.233 回答