首页 文章

如何使用链接列表中的对象实现添加和删除方法

提问于
浏览
0

链表

o void add(Train) - 创建一个包含参数对象的新节点,并将该节点添加到列表中,使列表保持升序排序顺序 .

o Train delete(int) - 使用参数化列车编号搜索列车 . 如果找到,请从列表中删除它并返回Train对象 . 如果未找到,则返回null .

public void add(Train myTrain) 
{            
        if (myTrain == null) {   
            currentPosition.setNext=new ListNode(myTrain);
        }   
        currentPosition.setNext(new ListNode(myTrain)); 
        currentPosition = currentPosition.getNext();    
        count++;
}

public Train delete(int index)
{                     
        ListNode tmp = head;    
        for (int  i = 0; i < index; i++)        
        {                                
            tmp = tmp.next;     
        }       
        tmp.next = tmp.next.next;             
        count--;
        return tmp.train;
}

我的添加和删除无法正常工作 . 我不知道如何删除trainNumber . 我不知道如何在不使用节点索引的情况下执行此操作 .

2 回答

  • 0

    您不是要将火车相互比较以保持排序 . 我会去做类似的事情:

    public void add(Train myTrain) {
        add(myTrain, head);
    }
    
    private void add(Train myTrain, ListNode head) {
        if (head.getNext() == null) {
            // End of list
            head.setNext(new ListNode(myTrain));
            count++;
        } else if (head.getNext().getTrain().getTrainNumber() < myTrain.getTrainNumber()) {
            // We found the spot.
            ListNode newNode = new ListNode(myTrain);
            newNode.setNext(head.getNext());
            head.setNext(newNode);
            count++;
        } else {
            // This was not the spot, try next position.
            add(myTrain, head.getNext());
        }
    }
    
    
    public Train delete(int trainNumber) {
        if (head == null) {
            // There is no list at all.
            return null;
        }
        return delete(trainNumber, head);
    }
    
    public Train delete(int trainNumber, ListNode currentNode) {
        if (currentNode.getNext() == null) {
            // No train found.
            return null;
        } else if (currentNode.getNext().getTrain().getTrainNumber() == trainNumber) {
            // The next train should be deleted.
            ListNode tmp = currentNode.getNext();
            currentNode.setNext(currentNode.getNext().getNext());
            return tmp.getTrain();
        } else {
            return delete(trainNumber, currentNode.getNext());
        }
    }
    
  • 0

    你的删除方法正在返回错误的列车 . 这是一个可视化 . 在你的for循环之后,它看起来像这样:

    tmp        tmp.next   tmp.next.next
      v          v          v
    [train 1]->[train 2]->[train 3]
    

    所以当你做 tmp.next = tmp.next.next 时,你最终得到这个:

    tmp        tmp.next
      v          v
    [train 1]->[train 3]
    
               [train 2]
    

    但是在方法结束时,你正在做 return tmp.train ,正如你所看到的, tmp 仍然指向 train 1 ,这不是你删除的那个 . 您需要做的是将已删除的节点存储在临时变量中,这样一旦从列表中删除它,您仍然可以访问它:

    public Train delete(int index)
    {                     
            ListNode tmp = head;    
            for (int  i = 0; i < index; i++)        
            {                                
                tmp = tmp.next;     
            }
            ListNode deleted = tmp.next;       
            tmp.next = tmp.next.next;             
            count--;
            return deleted.train;
    }
    

    当然,您仍然需要添加一些边界检查以确保 index 在列表中 .

相关问题