在已实现的链表中获取方法Java

时间:2012-10-02 17:28:38

标签: java linked-list

我需要实现一个从零开始的整数链接列表(不使用现有的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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

您目前的实施无法做到这一点。因为您要将每个新节点添加为头节点。

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

答案 2 :(得分: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);
}

答案 3 :(得分:0)

我建议使用双链表:

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

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

你的add方法实际上只是创建一个新节点,并将它附加到尾部的“next”指针,重新分配尾部,并递增计数。 (是的,你可以使用单个链表进行此操作,只要你有一个尾指针)

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

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

我认为这是作业,所以我不想把整个代码都拿走。