4

我需要实现一个从零开始的整数链接列表(不使用现有的 LinkedList 类)。

这是代码:

单个链接类

public class Link {
    public int data;
    public Link nextLink;

    public Link(int d1) {
        data = d1;      
    }

    public void printListElements(){
        System.out.println(data);
    }
}

和 LinkedList 类

public class LinkedList {
    private Link first;
    public LinkedList(){
        first = null;
    }

    public void add(int data1){
        Link linklist = new Link(data1);
        linklist.nextLink = first;
        first = linklist;
    }

    public void printList(){
    Link current=first;
    System.out.println("List Elements are ");
    while(current!=null){
       current.printListElements();
       current=current.nextLink;
    }
  }
}

如您所见,它已经添加printList方法。但是我如何创建一个 get() 方法,它返回一个特定索引的值。

这就是我的意思:

public static void main(String args[]){
    LinkedList MyList = new LinkedList();

    MyList.add(1);
    MyList.add(2);
    MyList.add(3);
    MyList.add(4);

    System.out.println("MyList.get(0)"); // should get 1
        System.out.println("MyList.get(1)"); // should get 2 etc
}

先感谢您。

4

4 回答 4

7

好吧,既然它是一个链表,除了第一个元素之外,你没有任何方法可以直接访问任何元素,对吧?因此,唯一的方法是从那里开始并逐步执行(通过连续跟随指向下一个元素的链接),直到到达索引指定的元素,然后返回该元素。最简单的方法是使用循环。

于 2012-10-02T17:31:10.377 回答
6

你不能用你当前的实现来做到这一点。因为您将每个新节点添加为头节点。

如果您更改您的add()以便将每个新节点添加为最后一个节点,那么您可以使用index传递给的值get()作为循环计数器来执行此操作。

于 2012-10-02T17:32:54.557 回答
1

在 LinkedList 中,您可以还原您的元素。

public int get(int i) {
    int n = indexOf(first); // count-1 actually
    Link current = first;
    while (n > i) {
        --n;
        current = current.nextLink;
    }
    return current.data;
}

private int indexOf(Link link) {
    if (link == null) {
        return -1;
    }
    return 1 + indexOf(link.nextLink);
}
于 2012-10-02T17:43:38.943 回答
1

我建议使用双链表:

class Node<T> {
   Node<T> next;
   Node<T> prev;
   T data;
}

class LinkedList<T> {
   Node<T> head;
   Node<T> tail;
   int count;
}

您的 add 方法实际上只是创建一个新节点,并将其附加到尾部的“下一个”指针,重新分配尾部,并增加计数。(是的,只要你有一个尾指针,你就可以用一个链表来做到这一点)

这种方法 add 是一个恒定时间操作并保留插入顺序(与您采用的单链表方法不同,其中不保留插入顺序)。

此外,您可以优化“get”以查看请求的索引是否更接近头部或尾部,并从适当的末端遍历以获得您想要的节点。

我认为这是家庭作业,所以我不想放弃整个代码。

于 2012-10-02T18:53:15.353 回答