我在理解如何插入链表中时遇到困难。我在网上找到了一些例子,但我似乎无法 100% 理解它。在这个代码中,我已经对我认为代码中发生的事情以及我正在努力的事情进行了注释。一些帮助将不胜感激。谢谢!
private static final class Node {
final Person person;
Node next;
Node(Person person) {
this.person = person;
}
}
public boolean insert(Person person) {
Node n = new Node(person);
//insert as the first element
if (head == null) {
head = n;
size++;
return true;
}
Node current = head;
Node prev = null;
int comparison;
while (current != null) {
//until the list is empty compare
comparison = person.name.compareTo(current.person.name);
//that person already exists
if (comparison == 0) {
return false;
} else if (comparison > 0) {
//if the next spot in the list is empty place the person there
if (current.next == null) {
current.next = n;
break;
}
} else {
//this is the part I dont understand
if (prev == null) {
Node oldHead = head;
head = n;
head.next = oldHead;
break;
}
//dont understand this either
prev.next = n;
n.next = current;
break;
}
//keep moving through the list
prev = current;
current = current.next;
}
size++;
return true;
}
根据您在代码中进行的所有比较,这似乎是一个排序的链表,而不是一个普通的链表。
这段代码说,如果插入的值小于头部,我们希望这个新值是头部,原始头部是列表中的第二个值。因此,oldHead 是 head 的引用变量,只是为了暂时保存该值。之后,head = n 只是将 head(也就是列表中的第一个节点(设置为新节点,所以现在第一个节点是要插入的节点。然后 head.next = oldHead 将列表中的下一个值设置为等于列表的原始头部。现在,插入的值位于列表中的第一个,原始标题是列表中的第二个值。
if (prev == null) {
Node oldHead = head;
head = n;
head.next = oldHead;
break;
}
这段代码只是设置链接,以便将所有变量链接在一起。
//dont understand this either
prev.next = n;
n.next = current;
break;