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