编写此类是为了创建一个单一链接列表,并且具有在这样的链表中创建新节点的方法。
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;
}
我真的很难想到这一点。我会继续努力。谢谢你的阅读。
答案 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;
}