简体   繁体   English

链接列表 - 在当前节点之前插入节点

[英]Linked list - Inserting a node before the current node

I'm trying to work on a method that will insert the node passed to it before the current node in a linked list. 我正在尝试处理一个方法,该方法将在链接列表中的当前节点之前插入传递给它的节点。 It has 3 conditions. 它有3个条件。 For this implementation there cannot be any head nodes (only a reference to the first node in the list) and I cannot add any more variables. 对于此实现,不能有任何头节点(仅对列表中的第一个节点的引用),并且我不能再添加任何变量。

  1. If the list is empty, then set the passed node as the first node in the list. 如果列表为空,则将传递的节点设置为列表中的第一个节点。
  2. If the current node is at the front of the list. 如果当前节点位于列表的前面。 If so, set the passed node's next to the current node and set the first node as the passed node to move it to the front. 如果是这样,请将传递的节点设置为当前节点旁边的,并将第一个节点设置为传递的节点,以将其移动到前面。
  3. If the list is not empty and the current is not at the front, then iterate through the list until a local node is equal to the current node of the list. 如果列表不为空并且当前不在前面,则迭代列表直到本地节点等于列表的当前节点。 Then I carry out the same instruction as in 2. 然后我执行与2中相同的指令。

Here is my code. 这是我的代码。

public class LinkedList 
{
private Node currentNode;
private Node firstNode;
private int nodeCount;

public static void main(String[] args)
 {
 LinkedList test;
 String dataTest;
 test = new LinkedList();
 dataTest = "abcdefghijklmnopqrstuvwxyz";
 for(int i=0; i< dataTest.length(); i++) { test.insert(new String(new char[] { dataTest.charAt(i) }));  }
 System.out.println("[1] "+ test);

  for(int i=0; i< dataTest.length(); i++) { test.deleteCurrentNode(); }
  System.out.println("[2] "+test);

  for(int i=0; i< dataTest.length(); i++)
  {
  test.insertBeforeCurrentNode(new String(new char[] { dataTest.charAt(i) }));
   if(i%2 == 0) { test.first(); } else { test.last(); }
  }

  System.out.println("[3] "+test);
 }

public LinkedList()
{
    setListPtr(null);
    setCurrent(null);
    nodeCount = 0;
}

public boolean atEnd()
{
    checkCurrent();
    return getCurrent().getNext() == null;
}

public boolean isEmpty()
{
    return getListPtr() == null;
}

public void first()
{
    setCurrent(getListPtr());
}

public void next()
{
    checkCurrent();
    if (atEnd()) {throw new InvalidPositionInListException("You are at the end of the list. There is no next node. next().");}
    setCurrent(this.currentNode.getNext());
}

public void last()
{
    if (isEmpty()) {throw new ListEmptyException("The list is currently empty! last()");}

    while (!atEnd())
    {
        setCurrent(getCurrent().getNext());
    }

}

public Object getData()
{
    return getCurrent().getData();
}

public void insertBeforeCurrentNode(Object bcNode) //beforeCurrentNode
{
    Node current;
    Node hold;
    boolean done;
    hold = allocateNode();
    hold.setData(bcNode);
    current = getListPtr();
    done = false;
    if (isEmpty())
    {
        setListPtr(hold);
        setCurrent(hold);       
    }

    else if (getCurrent() == getListPtr())
    {
        System.out.println("hi" + hold);
        hold.setNext(getCurrent());
        setListPtr(hold);
    }

    else //if (!isEmpty() && getCurrent() != getListPtr())
    {
        while (!done && current.getNext() != null)
        {
            System.out.println("in else if " + hold);
            if (current.getNext() == getCurrent())
            {
                //previous.setNext(hold);
                //System.out.println("hi"+ "yo" + " " + getListPtr());
                hold.setNext(current.getNext());
                current.setNext(hold);
                done = true; 
            }

            //previous = current;
            current = current.getNext();
        }

    }
    System.out.println(getCurrent());

}

public void insertAfterCurrentNode(Object acNode) //afterCurrentNode
{
    Node hold;
    hold = allocateNode();
    hold.setData(acNode);
    if (isEmpty())
    {
        setListPtr(hold);
        setCurrent(hold);
        //System.out.println(hold + " hi");
    }

    else 
    {
        //System.out.println(hold + " hia");
        hold.setNext(getCurrent().getNext());
        getCurrent().setNext(hold);
    }
}

public void insert(Object iNode)
{
    insertAfterCurrentNode(iNode);
}

public Object deleteCurrentNode()
{
    Object nData;
    Node previous; 
    Node current;
    previous = getListPtr();
    current = getListPtr();
    nData = getCurrent().getData();

    if (isEmpty()) {throw new ListEmptyException("The list is currently empty! last()");}

    else if (previous == getCurrent())
    {
        getListPtr().setNext(getCurrent().getNext());
        setCurrent(getCurrent().getNext());
        nodeCount = nodeCount - 1;
    }

    else 
    {
        while (previous.getNext() != getCurrent())
        {
            previous = current;
            current = current.getNext();


        }
    previous.setNext(getCurrent().getNext());
    setCurrent(getCurrent().getNext());
    nodeCount = nodeCount - 1;  
    }
    return nData;
}

public Object deleteFirstNode(boolean toDelete)
{
    if (toDelete)
    {
        setListPtr(null);
    }
    return getListPtr();
}

public Object deleteFirstNode()
{
    Object deleteFirst;
    deleteFirst = deleteFirstNode(true);
    return deleteFirst;
}

public int size()
{
    return this.nodeCount;
}

public String toString()
{
    String nodeString;
    Node sNode;
    sNode = getCurrent();
    //System.out.println(nodeCount);
    nodeString = ("List contains " + nodeCount + " nodes");
    while (sNode != null)
    {
        nodeString = nodeString + " " +sNode.getData();
        sNode = sNode.getNext();
    }   
    return nodeString;
}

private Node allocateNode()
{
    Node newNode;
    newNode = new Node();
    nodeCount = nodeCount + 1;
    return newNode;
}

private void deAllocateNode(Node dNode)
{
    dNode.setData(null);
}

private Node getListPtr()
{
    return this.firstNode;
}

private void setListPtr(Node pNode)
{
     this.firstNode = pNode;
}

private Node getCurrent()
{
    return this.currentNode;
}

private void setCurrent(Node cNode)
{
    this.currentNode = cNode;
}

private void checkCurrent()
{
    if (getCurrent() == null) {throw new InvalidPositionInListException("Current node is null and is set to an invalid position within the list! checkCurrent()");}
}

/**NODE CLASS ----------------------------------------------*/

    private class Node 
    {
        private Node next; //serves as a reference to the next node 
        private Object data;

        public Node()
        {
            this.next = null;
            this.data = null;
        }


        public Object getData()
        {
            return this.data;
        }

        public void setData(Object obj)
        {
            this.data = obj;
        }

        public Node getNext()
        {
            return this.next;
        }

        public void setNext(Node nextNode)
        {
            this.next = nextNode;
        }

        public String toString()
        {
            String nodeString;
            Node sNode;
            sNode = getCurrent();
            //System.out.println(nodeCount);
            nodeString = ("List contains " + nodeCount + " nodes");
            while (sNode != null)
            {
                nodeString = nodeString + " " +sNode.getData();
                sNode = sNode.getNext();
            }   
            return nodeString;
        }
    }

 }

I have it working for my [1] and [2] conditions. 我让它适用于我的[1]和[2]条件。 But my [3] (that tests insertBeforeCurrentNode()) isn't working correctly. 但我的[3](测试insertBeforeCurrentNode())无法正常工作。 I've set up print statements, and I've determined that my current is reset somewhere, but I can't figure out where and could use some guidance or a solution. 我已经设置了打印语句,并且我已经确定我的当前是在某处重置,但我无法弄清楚在哪里可以使用某些指导或解决方案。

The output for [1] and [2] is correct. [1]和[2]的输出是正确的。 The output for [3] should read 应该读取[3]的输出

[3] List contains 26 nodes: zxvtrpnljhfdbcegikmoq suwya [3] List包含26个节点:zxvtrpnljhfdbcegikmoq suwya

Thanks for any help in advance. 在此先感谢您的帮助。

In your toString method you start printing nodes from the currentNode till the end of your list. toString方法中,您可以从currentNode开始打印节点,直到列表末尾。 Because you call test.last() just before printing your results, the currentNode will point on the last node of the list, and your toString() will only print 'a'. 因为在打印结果之前调用test.last()currentNode将指向列表的最后一个节点,而toString()将只打印'a'。

In your toString() method, you may want to change toString()方法中,您可能想要更改

sNode = getCurrent();

with

sNode = getListPtr();

to print your 26 nodes. 打印您的26个节点。

For [3] you need to keep pointers to two nodes: one pointer in the "current" node, the one you're looking for, and the other in the "previous" node, the one just before the current. 对于[3],您需要保留指向两个节点的指针:“当前”节点中的一个指针,您正在查找的节点,以及“前一个”节点中的另一个指针,即当前节点之前的指针。 In that way, when you find the node you're looking in the "current" position, then you can connect the new node after the "previous" and before the "current". 这样,当您找到正在查看“当前”位置的节点时,您可以在“上一个”之后和“当前”之前连接新节点。 In pseudocode, and after making sure that the cases [1] and [2] have been covered before: 在伪代码中,并确保案例[1]和[2]之前已被涵盖:

Node previous = null;
Node current = first;
while (current != null && current.getValue() != searchedValue) {
    previous = current;
    current = current.getNext();
}
previous.setNext(newNode);
newNode.setNext(current);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM