删除链接列表中给定键的节点

时间:2015-09-29 05:20:40

标签: java linked-list nodes

我很难搞清楚我的代码有什么问题。我想删除包含特定项目的所有节点。在我的代码下面的测试代码中,它要求我删除句子“to be or not to be”中的所有项目,然后返回头部,在这种情况下是“be”。有人可以用我的代码指出问题吗?谢谢。

package edu.csc130.assignment;
import java.util.LinkedList;

public class ListStackQueue {
/**
 * @param head the head of the input linked list
 * @param item the given value
 * @return the head of the linked list with nodes contains the given value removed
 * Assume for any node in the  linked list, node.item cannot be null
 */
  public static Node<String> removeNodes(Node<String> head, String item) {
    Node<String> curr = head;
    Node<String> prev = null;

    if (head == null) {
        System.out.println("list is empty");
    } else {
        while (curr != null) {
            if (curr.data != item) {
                prev = curr; 
                curr = curr.next; 
            } else if (curr == head && curr.data == item) {
                head = head.next; 
                curr = curr.next; 
            } else if (curr != head && curr.next != null && curr.data == item) {
                prev.next = curr.next; 
                curr = curr.next; 
            } else {
                curr.next = null; 
            }
        }   
    }

    return head;
  }
}

BuildList代码的一部分&lt; - 我道歉,我没有提出这部分代码。感谢那些迄今为止帮助过我的人。

/**
 * @param items input array
 * @return the first node of the linked list build from the input array
 */
public static <E> Node<E>  buildList(E[] items) {
    Node<E> head = null;
    if (items!=null && items.length>0) {
        head = new Node<E> (items[0], null);
        Node<E> tail = head;
        for (int i=1; i<items.length; i++) {
            tail.next = new Node<E>(items[i], null);
            tail = tail.next;
        }
    }
    return head;
}

/**
 * @param head the first node of the linked list
 * @return the length of the linked list
 */
public static <E> int getLength(Node<E> head) {
    int length = 0;
    Node<E> node = head;
    while (node!=null) {
        length++;
        node = node.next;
    }
    return length;
}

public static <E> E get(Node<E> head, int index) {
    E item = null;
    Node<E> node = head;
    for (int i=0; i<index; i++) {
        if (node != null) {
            node = node.next;
        } else {
            break;
        }
    }
    if (node!=null) {
        item = node.item;
    }
    return item;
}

public static class Node<E> {
    public Object data;

    public String data();
    E item;
    Node<E> next;

    public Node(E item) {
        this.item = item;
        this.next = null;
    }

    public Node(E item, Node<E> next) {
        this.item = item;
        this.next = next;
    }
}

测试代码:

package edu.csc130.assignment;
import org.junit.Assert;
import org.junit.Test;

import edu.csc130.assignment.ListStackQueue.Node;

public class ListStackQueueTest {

  @Test
  public void testRemoveNodes1() {
    Node<String> head = ListStackQueue.buildList(null);
    ListStackQueue.removeNodes(head, "to");
    Assert.assertNull(head);
  }

  @Test
  public void testRemoveNodes2() {
    String[] sentence = {"to", "be", "or", "not", "to", "be"};
    Node<String> head = ListStackQueue.buildList(sentence);
    head = ListStackQueue.removeNodes(head, "to");
    Assert.assertEquals(4, ListStackQueue.getLength(head));
    Assert.assertEquals("be", ListStackQueue.get(head, 0));
    Assert.assertEquals("or", ListStackQueue.get(head, 1));
    Assert.assertEquals("not", ListStackQueue.get(head, 2));
    Assert.assertEquals("be", ListStackQueue.get(head, 3));
  } 

  @Test
  public void testRemoveNodes3() {
    String[] sentence = {"to", "be", "or", "not", "to", "be"};
    Node<String> head = ListStackQueue.buildList(sentence);
    head = ListStackQueue.removeNodes(head, "be");
    Assert.assertEquals(4, ListStackQueue.getLength(head));
    Assert.assertEquals("to", ListStackQueue.get(head, 0));
    Assert.assertEquals("or", ListStackQueue.get(head, 1));
    Assert.assertEquals("not", ListStackQueue.get(head, 2));
    Assert.assertEquals("to", ListStackQueue.get(head, 3));
  }     

  @Test
  public void testRemoveNodes4() {
        String[] sentence = {"to", "be", "or", "not", "to", "be"};
        Node<String> head = ListStackQueue.buildList(sentence);
        head = ListStackQueue.removeNodes(head, "or");
        Assert.assertEquals(5, ListStackQueue.getLength(head));
        Assert.assertEquals("to", ListStackQueue.get(head, 0));
        Assert.assertEquals("be", ListStackQueue.get(head, 1));
        Assert.assertEquals("not", ListStackQueue.get(head, 2));
        Assert.assertEquals("to", ListStackQueue.get(head, 3));
        Assert.assertEquals("be", ListStackQueue.get(head, 4));
      }
}

这是我在使用JUnit测试在Eclipse中运行代码时遇到的错误。这是testRemoveNodes2测试的错误。 testRemoveNodes1测试没有错误。

java.lang.AssertionError: expected:<4> but was:<6>

1 个答案:

答案 0 :(得分:1)

我认为您的计划不起作用的唯一方法是,使用curr.dataitem的{​​{1}}和==的比较无法按预期工作。这是完全可能的,因为不建议使用这些运算符比较字符串,这不是常见的做法,除非你真的知道你正在做什么(优化),否则它们将无法达到你的预期。

例如,如果在!=的实施中,则使用ListStackQueue.buildList创建节点data字段的值。如果以这种方式创建值,那么new String(...)对于两个字符串永远不会成立,即使它们的值相同。

最重要的是,不要使用s1 == s2==比较字符串, 重写您的实现以使用!=代替, 然后它应该工作。 当然,当你这样做时,在对象上调用.equals之前,你需要首先验证它不是null,否则你将获得.equals

假设没有NullPointerException字段为data的节点,这应该有效:

null

我也放弃了一些多余的条件。

如果您想允许if (head == null) { System.out.println("list is empty"); } else { while (curr != null) { if (!curr.data.equals(item)) { prev = curr; curr = curr.next; } else if (curr == head) { head = head.next; curr = curr.next; } else if (curr != head && curr.next != null) { prev.next = curr.next; curr = curr.next; } else { curr.next = null; } } } return head; 的{​​{1}}值, 然后上面的null会更复杂一点, 将其替换为:

Node.data