如何在链表中的给定位置插入项目?

时间:2013-11-19 16:06:04

标签: java linked-list

您将如何添加项目:

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 一个

7 个答案:

答案 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 = addadd.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;
}