大家好,感谢所有帮助到目前为止,我已经完成了这个项目。
现在生病解释我的代码和我必须实现的特殊功能。 1.我的链表必须从特定数量的元素开始,你会在dll构造函数中看到这一点 2.一种将新值输入到创建的元素中的方法。 3.我有一个get方法来获取某个节点的值。如果用户调用的索引值大于列表大小,这也会创建新节点 4.我还创建了一个插入方法,将元素插入到特定位置。
我的节点类看起来像这样(抱歉小写的类名):
public class node {
private int _value;
public node(int v){
_value = v;
}
public node(){
}
public int get(){
return _value;
}
public void set(int v){
_value = v;
}
public node next = null;
public node prev = null;
}
我的DLL类(奇怪的名字,我只知道项目的标题):
public class BetterArray{
private int _size;
private node _head;
private node _tail;
public BetterArray(int n){
_head = null;
_tail = null;
_size = n;
if(_head == null){
_head = new node(0);
_tail = _head;
}
for(int i = 1; i < n; i++){
node current = _head;
for(int j = 1; j < i; j++){
current = current.next;
}
node newNode = current.next;
current.next = new node(0);
current.next.next = newNode;
current.next.prev = current;
_tail = current.next;
}
}
public BetterArray(){
}
public int get(int index){
int value = 0;
node temp = _head;
if(index < _size){
for(int loc = 0; loc < index; loc++){
temp = temp.next;
}
value = temp.get();
}
else{
for(int i = _size; i <= index; i++){
node current = temp;
for(int j = _size; j < i; j++){
current = current.next;
}
node newNode = current.next;
current.next = new node(0);
_size++;
current.next.next = newNode;
current.next.prev = current;
_tail = current.next;
}
}
return value;
}
public void put(int value, int index){
node temp = _head;
if(index < _size){
for(int loc = 0; loc < index; loc++){
temp = temp.next;
}
temp.set(value);
}
else{
for(int i = _size; i < index; i++){
node current = temp;
for(int j = _size; j < i; j++){
current = current.next;
}
node newNode = current.next;
current.next = new node(value);
_size++;
current.next.next = newNode;
current.next.prev = current;
_tail = current.next;
}
}
}
public void insert(int value,int index){
node current = _head;
for(int loc = 0; loc < index - 1; loc++){
current = current.next;
}
node temp = current.next;
current.next = new node(value);
_size++;
current.next.next = temp;
current.next.prev = current;
_tail = current.next;
}
}
public void delete(int index){
node pre = _head;
for(int loc = 0; loc < index; loc++){
pre = pre.next;
}
node current = pre.next;
pre.next = current.next;
_size--;
}
public int getSize(){
return _size;
}
答案 0 :(得分:1)
编辑:
既然我更了解你想要的东西(双链表数据结构的任意索引插入函数),这里有一些可能对你有用的代码:
public class BetterArray{
public node _head = null;
public node _tail = null;
public BetterArray(){
_head = _tail = new node();
}
public node insert(int val, int index) {
if (index < 0) {
throw new IllegalArgumentException("You must provide an index which is not negative");
}
node current = _head;
for (int i = 0; i < index; i++) {
if (current.next == null) {
current.next = new node();
current.next.prev = current;
_tail = current;
}
current = current.next;
}
current.set(val);
return current;
}
}
public class node {
private int _value;
private boolean _initialized;
public node(int v){
_value = v;
_initialized = true;
}
public node(){
_initialized = false;
}
public int get(){
if (!_initialized) {
throw new IllegalArgumentException("This node has not been set with any value");
}
return _value;
}
public void set(int v){
_value = v;
_initialized = true;
}
public node next = null;
public node prev = null;
}
你也可以尝试一下。做这样的事情:
BetterArray whatever = new BetterArray();
whatever.insert(5,3);
System.out.println(whatever._head.next.next.next.get());
您知道,还有已经实现的标准Java数据结构。您可能需要查看LinkedList。基本上我正在做的事情与添加节点相同,直到它的大小阻止它获得IllegalArgumentException
,然后执行set
。
原始邮件:
链接列表和数组是两种完全不同的数据结构。而不是专注于实现,考虑您想要对数据结构做什么。需要随机访问数据? (双重)链接列表将花费O(n)时间来为读取和写入找到正确的元素;您已经使用插入中实现的逻辑自己看到了这一点。对于阵列,随机访问是O(1)恒定时间操作。如果要编写像List这样的数据结构来进行随机访问,请尝试使用new node[n]
,并将整个数组对象私有地保存在内存中。
如果某些内容更大,标准做法是创建一个两倍于所请求索引大小的新数组,并将所有旧数据复制到新数组中。这是一个O(n)操作,而在列表开头或结尾插入链表是O(1)常数时间。
有中间地带吗?其实有!如果实现平衡二叉树,则可以获得O(lg(n))插入和O(lg(n))访问节点。我建议你刷新你的数据结构。尝试用铅笔和纸做,直到你理解结构的感觉,然后把它编入代码。除非你熟悉Java或者你的课程所要求的,否则坚持你学到的任何语言(我假设你是因为你写的风格和你打电话的方式而且#34 ;指针&#34)。否则你将同时学习两件事,这通常比一次学习一件事更难。