我在Java中编写了一个双向链表的简单实现,包含Person-objects。
class Node {
Node next, previous;
Object data;
Node() {
next = null;
previous = null;
data = null;
}
}
我还有一个带有代码的Person-class:
class Person {
String name;
Person(String name) {
this.name = name;
}
//Other methods
}
然后我有一个PersonList类,我在其中定义了插入和搜索Person-objects的方法:
class PersonList {
Node first, last, previous;
public void insert(Object myObject) {
Node n = new Node();
n.data = myObject;
//If list is empty
if(first == null) {
first = n;
last = n;
}
else {
n.previous = last;
last.next = n;
last = n;
}
}
}
所以这是我的问题:我正在尝试编写一个带有两个参数的方法:(i)一个新的Person-object和(ii)一个包含名字的String变量。方法是在名称匹配的人(所有名称都是唯一的)之前插入新对象。
public void insertBefore(Object myObject, String name)
我已经通过编写方法对方法进行了测试,以便在实现方法之后正确地找到新Person之前和之后的对象。现在,我的问题是改变节点,使它们指向正确的对象。
我有以下逻辑:如果列表中没有人,请执行简单insert() - 方法的第一部分。 否则,遍历搜索名称与给定名称匹配的Person的人员。如果找到该人,将其当前的前一个节点指针更改为指向newPerson,则newPerson的下一个指针必须指向当前人,最后,当前人必须是新人。
public void insertBefore(Object myObject, String beforeThisName) {
Node n = new Node();
Node current = first;
n.data = myObject;
//If no people in list (I already have code for this one)
//Else, if the list contains people
else {
//Iterate through list
while(current != null) {
Person currentPerson = (Person) current.data;
String currentName = currentPerson.getName();
//If the Person is found
if(currentName.equalsIgnoreCase(beforeThisName)) {
//This is simply a check to see whether loop finds the right position
System.out.println(current.previous.data.toString()); //After this person
System.out.println(current.data.toString()); //Before this person
/* Here is where the inserting before happens. */
current.previous = n; //The current person's previous person is the new person
n.next = current; //new person's next pointer is the current person
current = n; //current person is the new person
return;
}
current = current.next;
}
}
}
对此有任何帮助,我们非常感谢。我正在努力教自己的名单,而这个问题让我陷入了一段时间。谢谢!
答案 0 :(得分:3)
仅将新Person的下一个设置为currentPerson而将currentPerson的前一个设置为新Person是不够的。您还必须将新Person的前一个设置为currentPerson的原始前一个,以及新Person之前的下一个原始。
n.previous = current.previous;
n.previous.next = n;
current.previous = n; //The current person's previous person is the new person
n.next = current; //new person's next pointer is the current person
current = n; //current person is the new person
当然,你必须验证这些节点都不是null(因为你要添加的新Person可能是列表中的第一个Node)。
因此,如果这是列表的原始状态,并且您希望在" Prev"之间添加新节点。和"当前" :
-------- next ----> -----------
- Prev - - current -
-------- <---- prev -----------
您必须设置新节点n
的两个指针并更新两个指针
(currrent.previous和Prev.next):
-------- next ----> ----------- next ----> -----------
- Prev - - n - - current -
-------- <---- prev ----------- <---- prev -----------
答案 1 :(得分:2)
在双向链接列表中,您还有一个next
指针,所以您需要做的是:
current.previous
,例如到oldPrevious
current.previous
设为newNode
,将newNode.next
设为current
oldPrevious.next
设为newNode
,将newNode.previous
设为oldPrevious