【问题标题】:Get method in a implemented Linked List, Java已实现的链表中的获取方法,Java
【发布时间】:2012-10-02 17:28:37
【问题描述】:

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

如您所见,它已经有 addprintList 方法。但是我如何创建一个 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
}

提前谢谢你。

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 请注意,最好的方法是添加一个“last”字段来跟踪列表的尾部;否则,您将不得不遍历整个列表,以便在最后添加一个新元素。
      【解决方案3】:

      在 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);
      }
      

      【讨论】:

        【解决方案4】:

        我建议使用双链表:

        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”来查看请求的索引是更靠近头部还是尾部,并从适当的一端遍历得到你想要的节点。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 2012-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-15
          相关资源
          最近更新 更多