在单个链表中添加节点

时间:2012-12-03 07:42:35

标签: java algorithm

晚上好

我正在尝试自己实现单个链表,当我想创建搜索方法时,我遇到了一个问题。显然,当您想要搜索节点(将用于在某个位置插入节点)时,您必须评估一些值以查看是否到达了正确的位置。考虑到我的节点只有一个数据字段作为标识符,我没有看到任何其他方式而不是使用它。但是,由于数据字段不是唯一的,因此可能有多个节点符合条件。

考虑以下列表:5,7,2,8,3,1,6,5,8,4,2。 当我想在列表中的某处添加节点时(例如:在值为8的节点之后),他将通过列表并在第一次出现'8'之后添加新节点。如果我想在第二个8之后插入它,我该怎么办?

单个链接列表是否可以实现这一点?

除此之外,我想对我的'removeLast()'方法有一些反馈,这似乎没有按照我的意愿去做(从列表中删除最后一个节点)。我知道如果列表只有1个值,我的代码不应该工作,我会在删除最后一个节点的通用代码工作后立即查看。

我的代码可以找到here

使用代码编辑:

 public class SingleLinkedList {

 public void deleteLast() {
    if (lastNode != null) {
        Node currentNode = firstNode;

        while (currentNode != null) {
            Node nextNode = currentNode.getNextNode();
            Node nextNextNode = nextNode.getNextNode();

            if (nextNextNode == null) {
                nextNextNode = null;
                lastNode = nextNode;
            }
        }
        listSize--;
    }
}

}

2 个答案:

答案 0 :(得分:3)

当然可以这样做 - 你需要跟踪你在路上传递的对象数量,并且在你通过n对象等于被搜索的对象之后 - 插入新数据:

public void addAfterNth(Object data,Object o, int n) { 
    Node curr = firstNode;
    while (curr != null) { 
        if (curr.data.equals(o)) n--;
        if (n == 0) { 
            Node newNode = new Node(data,curr.nextNode);
            curr.setNext(newNode);
            break;
        }
        curr = curr.getNextNode();
    }
}

在此处,在data遇到数据等于n的节点后,插入一个新参数,其中包含参数o中表示的数据。

以:

运行
SingleLinkedList list = new SingleLinkedList();
list.addLast(5);
list.addLast(7);
list.addLast(2);
list.addLast(8);
list.addLast(3);
list.addLast(1);
list.addLast(6);
list.addLast(5);
list.addLast(8);
list.addLast(4);
list.addLast(2);
list.drawList();
list.addAfterNth(999,8, 2);
System.out.println("");
list.drawList();

收益率(如预期):

5, 7, 2, 8, 3, 1, 6, 5, 8, 4, 2, 
5, 7, 2, 8, 3, 1, 6, 5, 8, 999, 4, 2, 

答案 1 :(得分:1)

这是用于删除LL的最后一个代码的伪代码。上述答案正确回答了您在特定位置插入的问题。

if (START == NULL){
    Print: Linked-List is empty.
}
else{
    PTR = START, PREV = START
    while (PTR->LINK != NULL)enter code here
        PREV = PTR //Assign PTR to PREV
    PTR = PTR->LINK //Move PTR to next node

    ITEM = PTR->INFO //Assign INFO of last node to ITEM
    If (START->LINK == NULL) Then //If only one node is left
        START = NULL //Assign NULL to START
    Else
        PREV->LINK = NULL //Assign NULL to link field of second last node

    Delete PTR
}