Java LinkedList在索引处插入Object

时间:2018-04-12 17:48:22

标签: java methods linked-list inner-classes singly-linked-list

我在理解如何将对象放置在链接中时遇到一些麻烦。 在这种情况下,如果特定索引处已存在对象,则不会替换它(这是另一种方法)。我想我无法理解如何获取特定索引,从该索引中检索数据,然后将数据放在那里并连接节点或告诉用户那里已有一个对象。

这是我的代码:

 <div class="uk-float-right uk-margin-small-right"><span class="uk-text-medium uk-text-center">{{ $dataSample[0]['prior'] }}</span></div>
 <div class="uk-float-right uk-margin-small-right"><span class="uk-text-medium uk-text-center">{{ $dataSample[0]['current'] }}</span></div>
 <div class="uk-float-right uk-margin-small-right"><span class="uk-text-medium uk-text-center">{{ $dataSample[0]['full'] }}</span></div>

这是内部类Coursenode:

public class CourseList {

    private Coursenode head;
    int currentSize;

    public void insertAtIndex(Course c, int index) {

        Coursenode insert =new Coursenode(c,head); 
        Coursenode temp = new Coursenode();

        if (index > currentSize - 1 || index < 0) {
            throw (new IndexOutOfBoundsException());
        }


        for(int x = 0; x < index; x++) {
            if (insert.getNext()!= null) {
                temp = insert;
                insert.setNext(insert);
                insert.setData(temp.getData());
            }
            if (insert.getNext() == null && x == index) {
                insert.setNext(insert.getNext());
            }
            if (insert.getNext() != null && x == index) {
                System.out.println("There is already a Course at that Index");
            }

        }
    }
}

任何想法都会受到赞赏,我怀疑我在节点之间的头部参考中迷失了但我无法弄清楚如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

在链接列表中的索引处插入有三种方法(假设为正index值):

  1. 在头部(index == 0
  2. 尾部(index >= currentSize
  3. 之后
  4. 中间(占用指数)(index > 0 && index < currentSize
  5. 可能有一种倾向认为在尾部插入是另一种情况,但稍后我们会看到尾部插入与中间插入相同,因为尾部会向前滑动。

    如果插入位于头部,则需要将插入节点的next设置为旧head,然后将head设置为插入的节点:

    private void insertAtHead(Course course) {
        Coursenode insertedNode = new Coursenode(c, head);
        head = insertedNode;
    }
    

    如果插入发生在尾部之外,处理此问题的常用方法是抛出某种异常,例如IndexOutOfBoundsException

    throw new IndexOutOfBoundsException("Cannot insert course after the tail of the course list");
    

    如果插入发生在占用索引处,则必须向前推送现有节点(以及现有节点之后的所有节点)。这意味着必须将插入节点的next设置为当前占用索引的节点,并且必须将当前索引处节点之前的节点的next设置为插入节点。本质上,插入的节点融合到列表中。为此,必须遍历列表,直到找到占用节点:

    private void insertAtOccupied(Course course, int index) {
        Coursenode previous = null;
        Coursenode current = head;
    
        for (int i = 1; i <= index; i++) {
            // Track the previous and current nodes
            //   previous = node at i - 1
            //   current = node at i
            previous = current;
            current = current.next;
        }
    
        Coursenode insertedNode = new Coursenode(c, current.next);
        previous.next = insertedNode;
    }
    

    将这些案例拉到一起,我们可以创建以下逻辑:

    public void insertAt(Course course, int index) {
    
        if (index == 0) {
            insertAtHead(course);
        }
        else if (index >= currentSize) {
            throw new IndexOutOfBoundsException("Cannot insert course after the tail of the course list");
        }
        else if (index > 0 && index < currentSize) {
            insertAtOccupied(course, index);
        }
    }
    

答案 1 :(得分:0)

首先是链接列表,如果

  

指数&lt; linkedlistsize

然后在链表中已有一个对象。如果node.next中有一个空节点,则表明您知道自己已到达链表的末尾。

public class CourseList {

    private Coursenode head;
    int currentSize;

    public void insertAtIndex(Course c, int index) {

        Coursenode insert =new Coursenode(c,head); 
        Coursenode temp = new Coursenode();

        if (index > currentSize - 1 || index < 0) {
            throw (new IndexOutOfBoundsException());
        }

        //tempnode = head;
        for(int x=1; x< index;x++) {
         //tempnode = tempnode.next;
        }
        //nodeatindex = tempnode;
        //you can get details of the node
} 

希望这有帮助!