insertAtPos方法DoublyLinkedList

时间:2017-02-20 03:10:17

标签: java

我想尝试在节点的某个位置添加一个字符串。出于某种原因,当我尝试在某个位置输入新字符串时,它会删除列表中已有的所有现有数据。我不确定是什么问题。

public void insertAt(String data, int pos)
    {
        if(head == null)
            insertAtStart(data);
        else if(pos < 1 || pos > size)
            System.out.println("Position Out Of Bounds");

        Node current = head;
        int i = 1;
        while(i < pos)
        {
            current = current.next;
            i++;
        }

        if(current.prev == null)
        {
            Node newLink = new Node(data);
            current.prev = newLink;
            head = newLink;
        }
        else
        {
            Node newLink = new Node(data);
            current.prev.next = newLink;
            current.prev = newLink;
        }
        size++;
    }

2 个答案:

答案 0 :(得分:0)

您未设置newLink.prevnewLink.next。这导致链表中间链接断开。

在头部案例(current.prev == null)中,在覆盖head之前:

newLink.next = head;

在常见情况下,在覆盖current.prev;

之前
newLink.prev = current.prev;
newLink.next = current;

答案 1 :(得分:0)

请考虑以下几点

  1. 当前节点当前是列表中的第一个元素吗?
  2. 当前节点已经在列表中间的某个地方结束了?
  3. 当前节点当前是列表中的最后一个元素吗?
  4. 每个案例都有独特的处理方式

    案例1

            if( current == head ) // sure its the head but..
            {
                if( head.next != null ) // is the list NOT EMPTY?
                {
                    newLink.next = head;
                    head = newLink;
                }
                else // list is empty
                {
                    head = newLink;
                }
            }
    

    对于案例2,当前位于中间位置

     current.prev.next = newLink;
     newLink.prev = current.prev.next;
    
     newLink.next = current;
     current.prev = newLink;
    

    //当前指针指向newLink

    //因为它是一个双重列表,newLink.prev指针指向返回当前

    之前的节点

    // newLink旁边是什么?现在吧?

    //因为它是一个双重列表,current.prev指针指向返回newLink

    对于案例3,当前为空,列表末尾,但是请记住如果在for循环中将当前指针保存到当前,我们也可以解决这个问题

    prevToCurrent.next = newLink;
    newLink.prev = prevToCurrent;
    

    现在让我们编译所有案例

    public void insertAt( String data, int pos )
    {
        if( head == null )
        {
            head = new Node( data );
        }
        else
        {
            Node newLink = new Node(data);
            Node current = head , prevToCurrent = null;
            for( int x = 1; current != null && x < pos; x++ )
            {
                prevToCurrent = current;
                current = current.next;
            }
            if( current == head )
            {
                if( head.next != null )
                {
                    newLink.next = head;
                    head = newLink;
                }
                else
                {
                    head = newLink;
                }
            }
            else if( current == null )
            {
                prevToCurrent.next = newLink;
                newLink.prev = prevToCurrent;
            }
            else
            {
                current.prev.next = newLink;
                newLink.prev = current.prev.next;
    
                newLink.next = current;
                current.prev = newLink;
            }
        }
        size++;
    }
    

    如果我在测试和编译之前出现问题,请告诉我,然后将其作为答案发布给您