链接列表节点指向不同类型的节点

时间:2012-08-20 21:27:46

标签: java linked-list singly-linked-list

这是我在这里的第一篇文章,但我不是网站的新手(称我为潜伏者)。 不幸的是,这次我似乎无法在没有询问的情况下找到我的问题的答案。 无论如何,到了这一点。

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

我想知道的是,是否可以将列表中的节点链接到另一个不同类型的列表。 不好的例子: (例如。)如何将类型的节点链接到类型的节点?假设我们有一个7个内部值的LL [1,2,3,4,5,6,7]和7个字符串的LL [周一,周二,周三,周四,周五,周六,周日]。我们希望将包含1的节点链接到包含星期一的节点。

确切地说,我遇到的问题如下: 我有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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

如果你想产生这种效果,另一种方法可能是拥有节点对象的接口(可能称之为ILinkNode),在两个不同的节点类中重写getInfo和setInfo。然后nodeLink可以指向接口对象,而无需在代码中的任何地方进行特殊的类型转换。

答案 1 :(得分:0)

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

类似的东西:

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

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