我正在实现一个循环的DoublyLinkedList数据结构。像单链列表一样,双链列表中的节点都有对下一个节点的引用,但是与单链列表不同,双链列表中的节点也有对前一个节点的引用。
另外,由于列表是“循环的”,因此列表中最后一个节点中的“下一个”引用指向列表中的第一个节点,列表中第一个节点中的“上一个”引用指向列表中的最后一个节点名单。
我需要启动我的get方法的帮助,我一直在四处寻找,因为我正在使用Generic Type,所以找不到任何可以帮助我的东西。我需要返回E,其他所有示例都以int为例来说明。这是我的代码:
public class DoublyLinkedList<E> { private Node first; private int size; @SuppressWarnings("unchecked") public void add(E value) { if (first == null) { first = new Node(value, null, null); first.next = first; first.prev = first; } else { first.prev.next = new Node(value, first, first.prev); first.prev = first.prev.next; } size++; } private class Node<E> { private E data; private Node next; private Node prev; public Node(E data, Node next, Node prev) { this.data = data; this.next = next; this.prev = prev; } } @SuppressWarnings("unchecked") public void add(int index, E value) { if (first.data == null) { throw new IndexOutOfBoundsException(); } else if (index == 0) { first = new Node(value, first.next, first.prev); } else { Node current = first; for (int i = 0; i < index - 1; i++) { current = current.next; } current.next = new Node(value, current.next, current.prev); } } @SuppressWarnings("unchecked") public void remove(int index) { if (first.data == null) { throw new IndexOutOfBoundsException(); } else if (index == 0) { first = first.next; } else { Node current = first.next; for (int i = 0; i < index - 1; i++) { current = current.next; } current.next = current.next.next; } size--; }
我想不出一种入门的方法,但是基本上该方法应该做的是返回列表中指定索引处的元素。如果index参数无效,则应抛出IndexOutOfBoundsException。
public E get(int index) { }
另外,我的remove方法也不准确,但是我会发现自己一个人,我只需要get方法的帮助即可。
我遇到的另一个问题是,在我的Node Class中,当我没有它时可以继续前进。让我们更新为
private class Node { private E data; private Node next; private Node prev; public Node(E data, Node next, Node prev) { this.data = data; this.next = next; this.prev = prev; } }
现在,我的getMethod()将如下所示:
@SuppressWarnings("unchecked") public E get(int index) { if(index < 0) { throw new IndexOutOfBoundsException(); } if(index > size) { throw new IndexOutOfBoundsException(); } Node current = first; for (int i = 0; i < index; i++) { current = current.next; } return current.data; }