我的目标是给函数“省略”一个整数,如果该整数位于节点的“信息”插槽中,那么该节点将被删除。我明白我必须做什么,只是很难执行它。这是我的ListNode内部类:
private int howmany;
private ListNode c;
private class ListNode {
private int info;
private ListNode link;
public ListNode() {
info = 0;
link = null;
}
public ListNode(int i, ListNode pointer) {
info = i;
link = pointer;
}
}
这是我尝试的省略方法:
public void omit(int i){
ListNode pointer;
pointer = c;
if (pointer.info == i){
pointer=pointer.link;
}
ListNode prev = pointer;
ListNode curr = pointer.link;
while (curr != null) {
if (curr.info == i){
prev.link = curr.link;
}else{
prev = prev.link;
curr = curr.link;
}
}
这种省略方法不起作用。我在我的客户端尝试了它,我尝试省略的号码保留在列表中。谁能告诉我我做错了什么?
答案 0 :(得分:0)
假设您找到curr.info == i
的节点。在这种情况下,您不会修改导致无限循环的curr
。此外,在列表的开头,您最多可以跳过一个节点,但可以有任意数量的节点需要省略。
解决此问题的最佳方法是迭代列表并将未被省略的节点与未被忽略的最后一个节点连接起来:
public void omit(int i){
// remove elements from the start of the list
while (c != null && c.info == i) {
c = c.next;
}
ListNode lastKept = c;
ListNode current = c;
while (current != null) {
current = current.next;
// find next node to be kept
while (current != null && current.info == i) {
current = current.next;
}
lastKept.next = current;
lastKept = current;
}
}