数据结构类,实现具有头,尾和当前节点的单链表。如果遇到方法问题,可以在正确的方向上使用微调。
从作业中,编写方法:
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;
}
}
我的添加方法似乎仅在我将项目添加到列表中间时才起作用,而不是在任何一端。如果我用它来添加一些项目,然后打印列表,只有我添加的第一个项目将在列表中,而我的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;
}
}
答案 0 :(得分:5)
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
这是因为tail
- append
所依赖的 - 继续指向执行第二次Node
操作后的第一个add
。
答案 1 :(得分:1)
我在这里看不到任何问题,所以我猜这个问题在其他地方。
好的,我看到的唯一问题是删除:
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;
}
答案 2 :(得分:1)
我想我找到了你的问题。 如果你使用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
结论:“第二次添加”丢失,以及“第五次添加”和“第六次添加”,因为你的next()方法一到达尾部就会停止。如果最后添加新节点,则需要始终更新尾部。
希望这会有所帮助。 干杯,Chnoch
答案 3 :(得分:0)
我认为问题是
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;