单链表到双向链表 [英] Singly linked list to doubly linked list
问题描述
我的一位朋友希望我将他的代码转换为双重链接列表,尽管我根本不熟悉它。我查了一下双重链接列表,但我不知道他的代码怎么处理它。我不是大师级程序员。你有什么建议吗?
A friend of mine wants me to convert his code into a doubly linked list, though I'm not familiar with it at all. I've looked up doubly linked lists but I can't tell by his code what to do with it. I'm not a master programmer. Do you have any suggestions?
import java.util.Collection;
import java.util.List;
class SinglyLinkedList<E> implements List<E> {
private class SinglyLinkedListNode<T> {
T data;
SinglyLinkedListNode<T> next;
public SinglyLinkedListNode() {
this(null, null);
}
public SinglyLinkedListNode(T data) {
this(data, null);
}
public SinglyLinkedListNode(T d, SinglyLinkedListNode<T> n) {
data = d;
next = n;
}
public boolean equals(Object o) {
if (data != null && o != null) {
return data.equals(((SinglyLinkedListNode) o).data);
} else {
return (data == null && o == null);
}
}
}
private SinglyLinkedListNode<E> list, last;
private int size;
public SinglyLinkedList() {
clear();
}
public void clear() {
list = last = null;
size = 0;
}
public boolean contains(Object o) {
SinglyLinkedListNode<E> t = list;
while (t != null) {
if (t.data == null) {
if (o == null) {
return true;
}
} else if (t.data.equals(o)) {
return true;
}
t = t.next;
}
return false;
}
public boolean add(E e) {
SinglyLinkedListNode<E> n = new SinglyLinkedListNode<E>(e);
if (isEmpty()) {
list = last = n;
} else {
last = last.next = n;
}
size++;
return true;
}
public void add(int index, E e) {
int currSize = size();
if (index < 0 || index > currSize) {
throw new IndexOutOfBoundsException(
"Index: " + index + ", Size: " + size());
}
if (isEmpty()) // index must == 0
{
list = last = new SinglyLinkedListNode<E>(e);
} else {
if (index == 0) {
list = new SinglyLinkedListNode<E>(e, list);
} else {
SinglyLinkedListNode<E> n = list;
for (int i = 0; i < index - 1; i++) {
n = n.next;
}
n.next = new SinglyLinkedListNode<E>(e, n.next);
if (index == currSize) {
last = n.next;
}
}
}
size++;
}
public boolean equals(SinglyLinkedList<E> e) {
SinglyLinkedListNode<E> e1 = list, e2 = e.list;
try {
for (int i = 1; i <= size(); i++) {
if (!e1.equals(e2)) {
return false;
}
e1 = e1.next;
e2 = e2.next;
}
} catch (NullPointerException ex) {
return false;
}
return true;
}
public E get(int index) {
if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException(
"Index: " + index + ", Size: " + size());
}
SinglyLinkedListNode<E> n = list;
int i = 0;
for (; i < index; i++) {
n = n.next;
}
return n.data;
}
@SuppressWarnings("unchecked")
public int indexOf(Object o) {
SinglyLinkedListNode<E> n = list;
int i = 0;
while (n != null) {
if ((o == null
? (n.data == null)
: (((E) o).equals(n.data)))) {
return i;
}
n = n.next;
i++;
}
return -1;
}
public boolean isEmpty() {
return list == null;
}
public E remove(int index) {
if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException(
"Index: " + index + ", Size: " + size());
}
SinglyLinkedListNode<E> n = list, prevNode = null;
int i = 0;
while (true) {
if (index == i) {
if (n == list) // removing first node
{
list = list.next;
} else {
prevNode.next = n.next;
}
if (n == last) {
last = prevNode;
}
size--;
return n.data;
}
prevNode = n;
n = n.next;
i++;
}
}
@SuppressWarnings("unchecked")
public boolean remove(Object o) {
SinglyLinkedListNode<E> n = list, prevNode = null;
while (n != null) {
if ((o == null
? (n.data == null)
: (((E) o).equals(n.data)))) {
if (n == list) //removing first node
{
list = list.next;
} else {
prevNode.next = n.next;
}
if (n == last) {
last = prevNode;
}
size--;
return true;
}
prevNode = n;
n = n.next;
}
return false;
}
public int size() {
return size;
}
public String toString() {
String s = "((";
SinglyLinkedListNode<E> t = list;
if (t != null) {
while (t.next != null) {
s += t.data + ", ";
t = t.next;
}
s += last.data;
}
return s + "))";
}
推荐答案
我不喜欢不明白这个问题。如果这是家庭作业,你应该这样说 - 社区规则!一个快速解释,无论如何:
I don't understand the problem. If this is homework, you should say so -- community rules! A quick explanation, regardless:
链表是一个具有以下内容的结构,......好吧,结构:
A linked list is a structure with the following,... well, structure:
DATA |--> DATA
REFERENCE TO NEXT ITEM ---| REFERENCE TO NEXT ITEM ---...
链中的每个链接包含一些数据,以及定位链中下一个项目的方法。正如你所说,这是一个单链表。
Each "link" in the "chain" contains some data, and a way to locate the next item in the chain. That's a singly linked list, as you said.
双链表是一个非常相似的结构,只有链中的每个链接都包含一种定位下一个项的方法,以及一种定位前一项的方法。如果您需要能够以两种方式遍历列表,则需要这种结构。
A doubly linked list is a very similar structure, only each link in the chain contains both a way of locating the next item, and a way of locating the previous item. If you need to be able to walk the list both ways, you'll need this kind of structure.
|-> DATA |--> DATA
| REFERENCE TO NEXT ITEM ---| REFERENCE TO NEXT ITEM ---...
---------------------------------- REFERENCE TO PREV ITEM
Ooookay图纸很可怕。您可以通过Google查询查找双向链接列表的内容并获得更好的信息,但是很好。但是很好。
Ooookay the "drawings" are hideous. You can look up what a doubly linked list is with a Google query and get better information, on second thought, but oh well.
这篇关于单链表到双向链表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!