如何在不使用构造函数的情况下在Java中手动实现链接列表?

时间:2015-10-03 20:31:40

标签: java linked-list singly-linked-list

我意识到已经存在一些讨论如何在Java中实现链表的好线程,但是我似乎无法找到一个不使用像这样的构造函数的线程,

public LinkList() {
    Link = null;
}

或沿着这些方向的东西。但是,我没有在我的代码中这样做,因此我在编写一些方法时遇到了麻烦。

我有一个名为Link的类,它包含以下代码,注意没有任何构造函数,如上所示:

public class Link {
private Link next = null;
private String value = null;

public Link getNext(){
    return next;
}

public void setNext(Link nextLink){
    next = nextLink;
}

public String getValue(){
    return value;
}

public void setValue(String aValue){
    value = aValue;
}
}

然后我有我的LinkedList类,其中包含以下代码:

public class LinkedList {
private Link head = null;
private Link tail = null;

public Link getHead(){
    return head;
}

public void setHead(Link aLink){
    head = aLink;
}

public Link getTail(){
    return tail;
}

public void setTail(Link aLink){
    tail = aLink;
}

public boolean isEmpty(){
    return(head == null && tail == null);
}

public void addLast(String aString){
    Link link = new Link();
    link.setValue(aString);
    //tail.setNext(link);
    if(isEmpty()){
        head = link;
    }else{
        tail.setNext(link);
    }
    tail = link;

    }

public void addFirst(String aString) {
    Link link = new Link();
    link.setValue(aString);

    if(isEmpty()){  
        tail = link;
    }else{
        head.setNext(link);
    }
    head = link;        
}

public Link removeFirst(){
    Link temp = head;
    head = temp.getNext();
    temp.setNext(null);

    return temp;
}

}

我的addFirst方法和我的isEmpty方法似乎都有效,但我的addLastremoveFirst方法却没有。我已经绘制了图片,查看了伪代码,并在互联网上搜索过,但我似乎无法弄清楚这一点。

我需要知道如何使我的addLastremoveFirst方法工作,而不必像开头那样在我看到的所有其他示例代码中添加构造函数。

以下是他们需要通过的测试:

    @Test
public void testRemoveFirst(){
    list.addFirst("three");
    list.addFirst("two");
    list.addFirst("one");
    assertTrue("one".equals(list.removeFirst()));
    assertTrue("two".equals(list.removeFirst()));
    assertTrue("three".equals(list.removeFirst()));
}

@Test
public void testAddLast(){
    list.addFirst("three");
    list.addFirst("two");
    list.addFirst("one");
    assertTrue( "three".equals(list.removeLast()));
    assertTrue( "two".equals(list.removeLast()));
    assertTrue( "one".equals(list.removeLast()));
    assertNull(list.removeLast());
}

2 个答案:

答案 0 :(得分:2)

您需要对代码进行一次更改:您希望新链接指向您的旧版头,然后是“#34; next" (而不是相反),因为你想在开头插入它。

public void addFirst(String aString) {
        Link link = new Link();
        link.setValue(aString);

        if (isEmpty()) {
            tail = link;
        } else {
            link.setNext(head);
        }
        head = link;
    }

此外,您需要更改测试,因为现在比较String到Link实例而不是String到String

    assertTrue("one".equals(list.removeFirst().getValue()));
    assertTrue("two".equals(list.removeFirst().getValue()));
    assertTrue("three".equals(list.removeFirst().getValue()));

在这些更改之后,测试通过了我(第一个,你没有为第二个实现removeLast方法)。

答案 1 :(得分:0)

您不需要构造函数即可将null0false分配给对象字段。字段自动获取这些值。只需删除仅执行此类赋值的构造函数,执行就没有任何区别。

您还可以直接在声明中指定其他默认值,例如int a = 17,并且您还可以包含int b = a + 1之类的表达式,假设之前已声明了字段a。但是,您不能传递对于不同实例必须具有不同值的参数。这就是构造函数的用途。

你可能还有其他的bug仍然存在,但它不会是造成者的责任。

开发人员通常只使用现成的解决方案LinkedList