数据结构类,实现了一个包含头、尾和当前节点的单链列表。如果方法有问题,可以使用正确方向的轻推。
根据作业,写出方法:
add(item):在列表中的当前节点后添加item(String),并将当前指针设置为引用新节点。
我的尝试:
public void add(String item)
{
if(curr != null)
{
Node newNode = new Node(item, curr.next);
curr.next = newNode;
curr = newNode;
}
else
{
head = tail = new Node(item, null);
curr = head;
}
}
我的add方法似乎只有在我将项目添加到列表的中间时才有效,而不是在两端。如果我用它添加一些项目,然后打印列表,那么只有我添加的第一个项目会出现在列表上,而我的prepend和append方法测试得很好。
我的代码有什么明显的问题吗?我觉得我错过了一些显而易见的东西。
全部:
public class LinkedList {
Node head = null; /* Head of the list */
Node tail = null; /* Tail of the list */
Node curr = null; /* Current node in the list */
public void prepend(String item) {
if (head == null) {
head = tail = new Node(item, null);
curr = head;
} else {
head = new Node(item, head);
curr = head;
}
}
public void append(String item) {
if (head == null) {
head = tail = new Node(item, null);
curr = tail;
} else {
tail.next = new Node(item, null);
tail = tail.next;
curr = tail;
}
}
public void add(String item) {
if (curr != null) {
Node newNode = new Node(item, curr.next);
curr.next = newNode;
curr = newNode;
} else {
head = tail = new Node(item, null);
curr = head;
}
}
public void delete() {
if (curr.next == null) {
Node temp = head;
while (temp.next != curr) {
System.out.println(temp.item);
temp = temp.next;
}
temp.next = null;
curr = head;
}
}
public void find(String item) {
Node temp = new Node(curr.item, curr.next);
if (item.equals(temp.item))
curr = temp;
else {
temp = temp.next;
while (temp.next != null && temp != curr) {
if (item.equals(temp.item))
curr = temp;
}
}
}
public String get() {
if (curr != null)
return curr.item;
else
return "";
}
public boolean next() {
if (curr != tail) {
curr = curr.next;
return true;
} else
return false;
}
public void start() {
curr = head;
}
public void end() {
curr = tail;
}
public boolean empty() {
if (head == null)
return true;
else
return false;
}
}
Node
类:
class Node {
Node next;
String item;
Node(String item, Node next) {
this.next = next;
this.item = item;
}
}
add
确实存在一个问题:当节点已经存在时,它不会更新tail
。考虑以下动作序列:
LinkedList list = new LinkedList();
list.add("one");
list.add("two");
list.append("three");
如果你要打印它使用这个:
public void print() {
Node curr = this.head;
while(curr != null) {
System.out.println(curr.item);
curr = curr.next;
}
}
像这样:
list.print();
你会得到以下输出:
one
three
这是因为append
所依赖的tail
在执行第二个add
操作之后继续指向第一个Node
。
我在这里没有看到任何问题,所以我想问题出在其他地方。
好吧,我看到的唯一问题是删除:
public void delete()
{
Node temp = head;
while(temp != null && temp.next != curr) {
System.out.println(temp.item);
temp=temp.next;
}
if (temp != null && temp.next != null) {
temp.next = temp.next.next;
}
curr = head;
}
我想我发现了你的问题。如果使用append(),则直接将其添加到尾部之后。但是,如果在尾部之后添加了以前的节点,则不会将尾部设置为新节点。这意味着,一旦您两次调用append(),您就会丢失在第一次append(()之后添加的所有节点。
简要示例:
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("First add");
list.append("First Append");
list.add("Second add");
list.prepend("First prepend");
list.add("Third add");
list.prepend("Second prepend");
list.add("fourth add");
list.append("Second Append");
list.add("Fifth add");
list.add("Sixth add");
list.start();
do {
System.out.println(list.get().toString());
} while (list.next());
}
输出:
Second prepend
fourth add
First prepend
Third add
First add
First Append
Second Append
结论:"Second Add"以及"Fifth Add"one_answers"Sixth Add"都丢失了,因为next()方法一到达尾部就停止了。如果最后添加新节点,则需要始终更新尾部。
希望这能有所帮助。干杯,Chnoch
我认为问题出在
if (curr != null) {
Node newNode = new Node(item, curr.next); //<-- here (curr.next)
//and
Node(String item, Node next) {
this.next = next; //<-- here
尝试(编辑):
Node newNode = new Node(item, curr); // pass curr to the constructor of Node
curr = newNode;