我需要实现一个从零开始的整数链接列表(不使用现有的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
}
提前谢谢你。
答案 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”以查看请求的索引是否更靠近头部或尾部,并从适当的端部遍历以获取所需的节点。
我认为这是作业,所以我不想把整个代码都拿走。