- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现这个抽象类,其中实现的所有函数都必须使用递归来完成:
public abstract class List<E> implements Iterable<E> {
protected class Node<T> {
protected Node(T data) {
this.data = data;
}
protected T data;
protected Node<T> next;
}
public abstract void insert(E data);
public abstract void remove(E data);
public abstract E retrieve(int index);
public abstract boolean search(E data);
protected Node<E> head;
}
下面是我迄今为止的实现。我相信我已经正确地完成了搜索和检索方法,并且正确地完成了大部分删除方法。我担心的一个问题是我对插入方法的错误(我并不特别需要工作代码,但也许是一个伪代码,解释当抽象类只接受数据参数时如何插入,从而需要一个私有(private)类)。另一个问题是在删除方法的这种情况下:
if (key.compareTo(temp.data) == 0){
}
我不确定如何删除头节点,因为只能访问当前和下一个节点。任何帮助将不胜感激!
import java.util.Iterator;
import java.util.Random;
public class SortedList<E extends Comparable<? super E>> extends List<E> {
public static void main(String[] args) {
Random rand = new Random(1);
SortedList<Integer> list = new SortedList<Integer>();
list.insert(1);
System.out.println(list.search(1));
}
public Iterator<E> iterator() {
return new Iterator<E>() {
public boolean hasNext() {
return curr != null;
}
public E next() {
E temp = curr.data;
curr = curr.next;
return temp;
}
public void remove() {
throw new UnsupportedOperationException();
}
private Node<E> curr = (Node<E>)head;
};
}
public void insert(E data) {
Node<E> temp = new Node<E>(data);
Node<E> curr = head;
if (head == null || data.compareTo(head.data) < 0) {
temp.next = head;
head = temp;
}
insert(curr, data);
}
private void insert(Node<E> curr, E data){
if (curr.next == null) {
curr.next.data = data;
} else {
curr.next.insert(curr, data);
}
}
public void remove(E data) {
Node<E> curr = head;
remove(curr, data);
}
private void remove(Node<E> temp, E key){
if (temp == null){
return;
}
if (key.compareTo(temp.data) == 0){
}
if (key.compareTo(temp.next.data) == 0){
temp.next = temp.next.next;
return;
}
if (key.compareTo(temp.next.data) < 0){
remove(temp.next, key);
}
}
public E retrieve(int index)
{
Node<E> curr = head;
int counter = 0;
return retrieve(curr, index, counter);
}
private E retrieve(Node<E> temp, int idx, int c)
{
if (idx == c){
return temp.data;
}
return retrieve(temp.next, idx, c++);
}
public boolean search(E data)
{
Node<E> curr = head;
return search(curr, data);
}
private boolean search(Node<E> temp, E key)
{
if (temp == null){
return false;
}
if (key.compareTo(temp.data) == 0){
return true;
}
if (key.compareTo(temp.data) < 0){
return search(temp.next, key);
}
return false;
}
}
最佳答案
从头部移除:
由于您知道列表应始终排序,因此如果删除(当前) header value ,则下一个头应该是行中的“下一个”。您最初只能访问“头”节点,并且必须在列表中逐个向下移动。
因此,在这种情况下,假设您有一群人按名字顺序排队等候。如果他们都手拉手并按顺序形成一条链到下一个人,那么您将排在第一位的人移走。你可以从逻辑上假设握着他们手的人是新任领导。
Node<E> temp = new Node<E>(data);
if(check to see if you want to remove head){
temp.next = head.next; //current head points to next in line so so shall new head(temp);
head = temp; //head ref variable points to only new head and old one is inaccessible and will be cleared out during garbage collection.
}
在中间插入和删除:
使用之前牵手的相同比喻。如果我需要将一个人“插入”两个人中间,我首先必须找到他们所属的位置,然后让他们与“当前”和“下一个”之前和之后的人握手。
对于插入代码,您必须进行搜索,直到找到正确的插入位置,该位置可以位于两个节点之间,而不是假设如果下一个值为 null,则只插入。
private void insert(Node<E> curr, E data){
if (curr.next == null) {
curr.next.data = data; //only inserts if next value is null
} else { // what about inserting 3, into a list of {1,5}.
curr.next.insert(curr, data);
}
}
您需要检查当前值和下一个值的排序顺序是否正确。
else if(curr.data <= data && curr.next.data > data){
// you've found the nodes you want to insert in between
}else{
... keep searching until you hit a null
}
关于java - 递归插入/删除排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39962204/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!