这就是添加项目的方式:
public void insert (Object item)
{
Link add = new Link();
add.data = item;
add.next = head;
_head = add;
++_listsize;
}
但是如何在给定的位置添加项目。到目前为止,我得到的是:
public void insert (Object item, int pos)
{
Link add = new Link();
int ix = pos - 1;
add.next = _head;
for (int i = _listsize - 1; i >= ix; --i)
add = add.next;
add.data = item;
_head = add;
++_listsize;
}
如果项目是连续的,这将正确地插入项目,但假设我被赋予一个位于中间的位置,它将插入项目,但是它将完全切断(或删除其余部分)。例如:
在1:
插入位置2:b
插入位置3:cb
插入位置2:d
您应该这样做:
public void insert (Object item, int pos)
{
Link add = new Link();
int ix = pos - 1;
Link cur = _head;
for (int i = 0; i < _list_size; i++) {
if(i == ix) {
add.next = cur.next;
cur.next = add;
}
cur = cur.next;
}
++_listsize;
}
您似乎没有正确地将新的Link
插入到列表中。当您这样做时,您需要找到给定位置的Link
以及上一个位置的Link
。那么只有您可以设置previous.next = add
和add.next = position
。
下面是完成该任务的更新方法。
public void insert (Object item)
{
Link add = new Link();
add.data = item;
add.next = _head;
_head = add;
++_listsize;
}
public void insert (Object item, int pos)
{
Link add = new Link();
add.data = item;
int ix = pos - 1;
add.next = _head;
Link previous = _head;
for (int i = _listsize - 1; i > ix; --i) {
previous = previous.next;
}
Link position = previous.next;
previous.next = add;
add.next = position;
++_listsize;
}
使用add( int index, E element)
,在指定索引处插入元素:http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#add(int,E)
编辑:当然,如果你使用的是LinkedList;对于您自己的类,您必须存储prev/next指针并简单地更新它们(上一个节点next的指针应该指向新元素,下一个节点previor的指针也应该指向新元素)
这是完全可能的。但最重要的是决定在哪个位置插入新元素,因为每次插入后,列表都会发生变化,必须适当地决定即将到来的新元素的位置。你可以试试这个
insertat=head;
for(i=0;i<pos;i++){
insertat=insertat.next;
}
add.next=insertat.next;
insertat.next=add;
listsize++;
您需要一个临时变量,该变量从头开始,遍历每个节点,直到所需位置或列表的末尾,然后插入新节点。
由于这是一个家庭作业练习,我只会发布伪代码:
if pos < 0
//define what to do here...
return
end if
if pos == 0
//inserting at the beginning
insert(item)
return
end if
Link temp <- head
int index <- 0
while index < pos and temp->next != null
temp <- temp->next
index <- index + 1
end while
//now you're at your desired location or at the end of the list
Link newLink <- new Link
newLink->data <- item
newLink->next <- temp->next
temp->next <- newLink
在尝试单独实现概念后,您可以考虑开源研究。使用开源可以做的最好的事情之一是从中学习,研究java.util.LinkedList、的实现
遵循add(int index,E元素)方法的逻辑{http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/LinkedList.java#360},您可以在中划分;
1) 获取元素的添加位置,在您的情况下为"链接"http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/LinkedList.java#380
2) 并且您可以检查链接代码片段中遵循逻辑"添加之前"的元素的代码http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/LinkedList.java#794
因此,您将了解算法背后的逻辑,并能够执行自己的实现
我的解决方案不像递归那样干净,但如果您正在测试列表中超过50000个元素,请使用迭代解决方案。或者您可以修改JVM并更改堆栈大小。因为您可能会因为将通过堆栈中激活记录的容量而导致堆栈溢出。想想最坏的情况,你将在列表的末尾插入。
/**
* Inserts the specified element at the specified position in this list.
*
* @param :index the desire position starting from 0 2,3,4,5
* @param :data the content of the new node
* @return Boolean: if the insertion was successfully return true otherwise false
*/
public boolean add(int index, T data) {
/*Add to the end of the list*/
if (index == size()) {
add(data);
return true;
}
/*Empty list and index bigger than 0*/
else if (this.front == null && index != 0) {
return false;
} else {
Node<T> tempNode = this.front;
while (tempNode != null && tempNode.next != null && --index != 0) {
tempNode = tempNode.next;
}
if (index != 0) {
return false;
} else {
Node<T> newNode = new Node<T>(data);
/*Empty list,and index is 0*/
if (tempNode == null) {
this.front = newNode;
} else {
newNode.next = tempNode.next;
tempNode.next = newNode;
}
}
}
return true;
}