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



这就是添加项目的方式:

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 = 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;
}

使用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;
}

相关内容

  • 没有找到相关文章

最新更新