我必须为我的项目实现一个单链表,我很难让删除方法工作。我在这里搜索了答案,但我找不到任何包含尾巴参考的答案。我的项目需要在列表中有一个头和尾引用,并且需要在任何必要的地方更新。这是我的类和删除方法:
public class BasicLinkedList<T> implements Iterable<T> {
public int size;
protected class Node {
protected T data;
protected Node next;
protected Node(T data) {
this.data = data;
next = null;
}
}
protected Node head;
protected Node tail;
public BasicLinkedList() {
head = tail = null;
}
public BasicLinkedList<T> addToEnd(T data) {
Node n = new Node(data);
Node curr = head;
//Check to see if the list is empty
if (head == null) {
head = n;
tail = head;
} else {
while (curr.next != null) {
curr = curr.next;
}
curr.next = n;
tail = n;
}
size++;
return this;
}
public BasicLinkedList<T> addToFront(T data) {
Node n = new Node(data);
if(head == null){
head = n;
tail = n;
}
n.next = head;
head = n;
size++;
return this;
}
public T getFirst() {
if (head == null) {
return null;
}
return head.data;
}
public T getLast() {
if(tail == null){
return null;
}
return tail.data;
}
public int getSize() {
return size;
}
public T retrieveFirstElement() {
// Check to see if the list is empty
if (head == null) {
return null;
}
Node firstElement = head;
Node curr = head.next;
head = curr;
size--;
return firstElement.data;
}
public T retrieveLastElement() {
Node curr = head;
Node prev = head;
// Check to see if the list is empty
if (head == null) {
return null;
} else {
// If there's only one element in the list
if (head.next == null) {
curr = head;
head = null;
} else {
while (curr.next != null) {
prev = curr;
curr = curr.next;
}
tail = prev;
tail.next = null;
}
}
size--;
return curr.data;
}
public void remove(T targetData, Comparator<T> comparator) {
Node prev = null, curr = head;
while (curr != null) {
if (comparator.compare(curr.data, targetData) == 0) {
//Check to see if we need to remove the very first element
if (curr == head) {
head = head.next;
curr = head;
}
//Check to see if we need to remove the last element, in which case update the tail
else if(curr == tail){
curr = null;
tail = prev;
prev.next = null;
}
//If anywhere else in the list
else {
prev.next = curr.next;
curr = curr.next;
}
size--;
} else {
prev = curr;
curr = curr.next;
}
}
}
public Iterator<T> iterator() {
return new Iterator<T>() {
Node current = head;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public T next() {
if(hasNext()){
T data = current.data;
current = current.next;
return data;
}
return null;
}
@Override
public void remove(){
throw new UnsupportedOperationException("Remove not implemented.");
}
};
}
}
我已经经历了很多次这种方法的迭代,每次我要么丢失头部引用,要么丢失尾部引用,要么不删除元素,我都被难住了。作为参考,这里是我正在运行的测试。我甚至没有考试不及格,它只是说不及格。
public void testRemove(){
BasicLinkedList<String> basicList = new BasicLinkedList<String>();
basicList.addToEnd("Blue");
basicList.addToEnd("Red");
basicList.addToEnd("Magenta");
//Blue -> Red -> Magenta -> null
basicList.remove("Red", String.CASE_INSENSITIVE_ORDER);
//Blue -> Magenta -> null
assertTrue(basicList.getFirst().equals("Blue"));
//getLast() returns the tail node
assertTrue(basicList.getLast().equals("Magenta"));
}
编辑:忘记提到删除方法应该从列表中删除目标数据的所有实例。
我只看到一个错误。如果您的列表最初是空的,以下方法将导致一个循环,其中一个节点的下一个节点指的是它自己:
public BasicLinkedList<T> addToFront(T data) {
Node n = new Node(data);
// The list was empty so this if is true
if(head == null){
head = n;
tail = n;
}
n.next = head;
// now head == n and n.next == head == n so you've got a circle
head = n;
size++;
return this;
}
您可以这样解决此问题:
public BasicLinkedList<T> addToFront(T data) {
Node n = new Node(data);
if(head == null){
tail = n;
}
n.next = head;
head = n;
size++;
return this;
}
我目前正在实现一个链表,在一个删除元素的函数上遇到了一些问题。下面是整个功能。如果列表为空,则退出程序。如果列表只有一个元素,那么我只使用另一个函数
我正在用C语言创建一个单链表,它有头部和尾部指针,其中头部指针指向SLL的起始节点,尾部指针指向SLL的最后一个节点。我不想使用head指针遍历到列表末尾来删除节点。有没有办法让我可以使用尾指针删除SLL的最后一个元素? 下面是节点添加函数。头部和尾部初始化为NULL。 要删除第一个节点,使用以下函数:
我有一个特定的JSON节点,对应于import org.codehaus.jackson。JsonNode,而不是导入org.codehaus.jackson.map.JsonNode。 我想从上述数组的所有JSON节点中删除“familyName”和“middleName”。有没有办法做到这一点?
假设我有一个,还有一个,它匹配我想从中删除的元素。但我不只是想丢弃它们,我想将匹配的元素移动到一个新集合中。在Java 7中,我会这样做: 我很好奇是否有一个流/Java8方法来做这件事。不幸地只是返回一个(甚至没有删除元素的数量?太糟糕了。)我设想了这样的东西(当然不存在): 注:此问题受类似问题启发;这个问题是关于在从集合中移除的项上获取流的更一般的情况。正如链接问题中所指出的,命令式解决方案
问题内容: 是否可以从加载中删除元素而不创建新元素?例如这样的事情: 问题答案: 通过告诉父节点删除子节点来删除该节点: 请参阅文档 和 文档 。
是否可以从加载的中删除元素而不创建新元素?例如,类似这样的事情: