我的添加方法是否在链接列表中的给定位置正确添加了一个?

时间:2017-03-25 22:28:10

标签: java linked-list insert nodes

编写此类是为了创建一个单一链接列表,并且具有在这样的链表中创建新节点的方法。

package utilities;

public class SLLNode
{
    private Object element;
    private SLLNode successor;

    public SLLNode(Object o)
    {
        this.element = o;
    }

    public void setNext(SLLNode sllNode)
    {
        this.successor = sllNode;
        // TODO Auto-generated method stub

    }

    public SLLNode getNext()
    {

        // TODO Auto-generated method stub
        return successor;
    }

    public Object getElement()
    {

        // TODO Auto-generated method stub
        return element;
    }

    //Constants
    //Attributes
    //Constructors
    //Getter and Setter Methods
    //Operational Methods
}

以下方法与此问题的标题有关,它是为了将新节点添加到SLL中的特定位置而编写的。是否有意义?此代码是否在for循环中迭代以在指定位置添加节点?

我一直在努力想出这个很长一段时间,我真的很感激反馈。非常感谢你提前。

@Override
public boolean add(Object element, int position) throws IndexOutOfBoundsException
{
//While the head != null iterate to the position of the list and add a new node
    int i;
    if(head != null)
    {
        for(i = 0; i < position; i++)
        {
            head.getNext();
            if(i == position)
            {
                head.setNext(new SLLNode(element));
                return true;
            }
        }
    }
    else
    head = new SLLNode(element);

    return false;
}

我真的很难想到这一点。我会继续努力。谢谢你的阅读。

2 个答案:

答案 0 :(得分:0)

你没有替换下一个元素而不是移位,你的add方法调用

public void setNext(SLLNode sllNode)
{
    this.successor = sllNode;
    // TODO Auto-generated method stub

}

如果你检查它在java中的实现方式,那么旧的继任者及其兄弟姐妹会在这里消失:

public void add(int index, E element) {
        checkPositionIndex(index);

        if (index == size)
            linkLast(element);
        else
            linkBefore(element, node(index));
    }

这里可能有趣的部分linkBefore

void linkBefore(E e, Node<E> succ) {
        // assert succ != null;
        final Node<E> pred = succ.prev;
        final Node<E> newNode = new Node<>(pred, e, succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        size++;
        modCount++;
    }

简而言之,将旧元素保留在内存中然后替换然后添加新元素并使用new.setNext(旧)将旧节点附加到新添加的元素。这样你就会有转变

答案 1 :(得分:0)

您不使用getNext()之类的返回值,使用临时持有者来存储它。下面的代码提供了一种可能的解决方案:

@Override
public boolean add(Object element, int position) throws IndexOutOfBoundsException {
    int i;
    SLLNode holder = null;

    if (head != null) {
        for(i = 0; i < position; i++) {
            holder = head.getNext();
            if (i == position) {
                SLLNode node = new SLLNode(element);

                //save next before overwriting it
                SLLNode next = holder.getNext(); 

                //holder references the last accessed element
                holder.setNext(node);

                //link the new node to the next node
                //to avoid breaking the list
                node.setNext(next);

                return true;
            }
        }
    } else
        head = new SLLNode(element);

    return false;
}