您将如何添加项目:
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: C b 一个
插入2: d 一个
答案 0 :(得分:1)
你应该这样做:
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;
}
答案 1 :(得分:1)
您似乎未将新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;
}
答案 2 :(得分:0)
使用add( int index, E element)
,在指定的索引处插入元素:http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#add(int, E)
编辑:如果您正在使用LinkedList,当然;使用您自己的类,您必须存储prev / next指针并简单地更新它们(前一个节点next指针应该指向新元素,而下一个节点previous指针也应该指向新元素)
答案 3 :(得分:0)
绝对可能。但最重要的是决定插入新元素的位置,因为在每次插入后,列表会发生变化,新元素的位置必须适当决定。你可以试试这个
insertat=head;
for(i=0;i<pos;i++){
insertat=insertat.next;
}
add.next=insertat.next;
insertat.next=add;
listsize++;
答案 4 :(得分:0)
您需要一个从头开始的临时变量,遍历每个节点直到所需位置或列表末尾,然后插入新节点。
由于这是一项家庭作业,我只会发布伪代码:
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
答案 5 :(得分:0)
单独尝试实施该概念后,您可以考虑开源研究。使用开源可以做的最好的事情之一就是从中学习,研究java.util.LinkedList的实现,
遵循方法的逻辑add(int index,E element){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
因此,您将了解算法背后的逻辑,并能够执行您自己的实现
答案 6 :(得分:0)
我的解决方案并不像递归那样干净,但如果你在列表中测试超过50,000个元素,那么请使用迭代解决方案。或者您可以修改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;
}