Java链接列表问题

时间:2011-08-24 23:31:58

标签: java linked-list

我正在尝试了解如何在Java中实现链接列表。

我应该为列表和节点创建单独的链表类,还是可以只调用import java.util.LinkedList,还是我们需要两者?

另外,我们需要一个迭代器来打印列表吗?

3 个答案:

答案 0 :(得分:4)

你在这里问过几个不同的问题。我想我已经在这里解决了所有问题,所以如果我错过了一些内容,请告诉我:

  1. 如果您的目标是成为链接列表的客户端,那么您应该只使用java.util.LinkedList。这是链接列表的预编写优化实现,适用于大多数应用程序。

  2. 如果您的目标是实施链接列表,那么您至少需要一个表示链接列表节点的类。根据您的使用情况,您可能还需要考虑创建一个类,如LinkedList,封装列表并在其周围导出一个漂亮的界面,以简化客户端的常见任务。通常,您可以通过将链接列表节点类型定义为面向客户端的链接列表中的嵌套类来执行此操作。

  3. 您可以拥有一个同时使用自定义链接列表和LinkedList集合的程序。一个用例就是让一个程序使用LinkedList主要作为队列的实现,但是使用一个公开的自定义链表来完成其他任务,它需要将列表专门拼接在一起或拉出单个单元格不在列表中。例如,如果您正在实现Fibonacci堆,即使您在程序的其他位置使用LinkedList,也可能会实现自己的链接列表。这两者并不相互排斥。

  4. 我不确定你在上一个问题中的“迭代器”是什么意思。如果要打印链接列表的内容,最好的方法是创建对链接列表的第一个单元格的引用,然后继续向前移动直到您到达列表的末尾。是否将其包装在java.util.Iterator对象中取决于您自己。创建实际的Iterator类型来进行迭代可能最容易,因为它允许您与foreach循环和其他操纵集合的API进行交互。

  5. 希望这有帮助!

答案 1 :(得分:1)

您是否想学习如何使用java.util.LinkedList或如何构建自己的自定义LinkedList?您无需使用java.util.LinkedList即可构建(实现)自己的LinkedList类。

在处理标准java.util.LinkedList时,我使用Iterator,而不是在实现自己的LinkedList类时,使用Iterator。

下面是带有append和print方法的LinkedList类的简单实现。我的打印方法完成了遍历LinkedList以显示每个元素的工作。

public class Solution {
    public static void main(String[] args) {
         LinkedList list = new LinkedList();
         list.append(1);
         list.append(2);
         list.append(3);
         list.append(5);
         list.append(4);
         list.append(8);

         list.print(list.head);
    }
}
class Node {
    Node next;
    int data;
    public Node(int d) {
       data = d;
    }
}
class LinkedList {
    Node head;

    public void append(int val) {
       if (head == null) {
          head = new Node(val);
          return;
       }
       Node current = head;
       while (current.next != null) {
          current = current.next;
       }
       current.next = new Node(val);
    }

    public void print(Node head) {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
    }
}

下面是使用java.util.LinkedList和Iterator的示例。

import java.util.LinkedList;
import java.util.Iterator;

public class Solution {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(1);
        list.add(2);
        list.add(4);
        list.add(7);
    }

    public static void print(LinkedList<Integer> list) {
         Iterator it = list.iterator();
         while(it.hasNext()) {
             System.out.print((int)(it.next()) + " ");
         }
    }
}

使用java.util.LinkedList时,甚至可以通过System.out.println()打印LinkedList

import java.util.LinkedList;
import java.util.Iterator;

public class Solution {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(1);
        list.add(2);
        list.add(4);
        list.add(7);

        System.out.println(list);
    }
}

答案 2 :(得分:0)

为了在Java中创建链接列表,您需要两个基类:-

  1. 节点类
  2. SinglyLinkedList(或DoublyLinkedList)类

您可以获取这些类和main()函数类here的Java链表代码的基本实现。