我目前正在上Java课程,教授告诉我们理解链接的一个好习惯是制作一个双重链表。我已经制作了一个单独的链接列表,但我无法将其转换为双向链表。所以我想知道是否有人可以给我任何建议,以确保我的最后一个号码与前一个号码相关联?如果前面的数字和最后一个数字连接到null。以下是代码的一部分,如果您希望更多内容只是询问,我将发布。
添加元素等的代码。这是我试图让尾部连接到最后一个数字的尝试。
public void add(int element){
Node n = new Node();
n.setItem(element);
n.setNext(head);
head = n;
>
//The tail connected to the new number added.
n.setItem(element);
n.setBefore(tail);
tail = n;
下面的代码是插入函数,我需要确保新插入的块连接,但是我正在考虑一种方法来连接两者。
public void insert(int element, int position){
int currentposition = 0;
Node currentNode = head;
//Traverse to the right position
while(currentposition < position-1){
currentposition++;
}
Node n = new Node();
n.setItem(element);
n.setNext(currentNode.getNext());
currentNode.setNext(n);
//The previous number connecting to the new number
currentNode = tail;
}
答案 0 :(得分:0)
您为每个保存其先前节点的节点添加一个额外的节点字段
插入伪码:
insert(Node n, index i) {
currentIndex = 0
currentNode = head
while (currentIndex < i) {
currentNode = currentNode.next
currentIndex++
}
n.prev = currentNode
n.next = currentNode.next
currentNode.next = n
}
答案 1 :(得分:0)
对于双向链表,您需要在类中添加head和tail字段,以便它保持双向链接的数据结构。
private Node<T> head = null;
private Node<T> tail = head;
private int size = 0;
要将新节点添加到链接列表的末尾,您可以执行
public void add(T element) {
Node<T> node = new Node<T>(element);
Node<T> current = head;
if(current == null) {
current = node;
head = tail = current;
} else {
tail.next = node;
node.prev = tail;
tail = node;
}
size++;
}
请注意,您还需要处理第一个if子句的空列表大小写。您还可以在添加节点时为尾部设置next和prev参考。
要在特定位置将列表插入列表,您需要考虑如果指定的位置小于0或大于现有列表大小,则会发生错误,因为您无法插入超出范围的元素指数。所以你可以抛出异常。此外,当插入的位置为0
(head
)或size
(tail
)时,您需要将案例分开。考虑到所有这些情况,解决方案是:
public void insert(T a, int position) {
if (position < 0 || position > size)
throw new IndexOutOfBoundsException();
Node<T> node = new Node<T>(a);
Node<T> temp;
if(position == 0) {
if(head == null)
add(a);
else {
temp = head;
head = node;
node.next = temp;
temp.prev = node;
}
return;
} else if (position == size) {
temp = tail;
tail = node;
temp.next = tail;
tail.prev = temp;
return;
}
Node<T> current = head;
int i = 0;
while (current != null && i < position-1) {
current = current.next;
i++;
}
temp = current.next;
current.next = node;
node.prev = current;
node.next = temp;
temp.prev = node;
}