我已经用add and traverse方法编写了一个单链表的小程序。现在我想将其转换为双向链表。我知道双链表的所有概念,但我在程序中实现它时遇到的困难很小。
public class SingleLinkList<T> {
private Node<T> head;
private Node<T> tail;
public void add(T element)
{
Node<T> nd = new Node<T>();
nd.setValue(element);
if (head==null)
{
head = nd;
tail = nd;
}
else
{
tail.setNextRef(nd);
tail = nd;
}
}
public void traverse(){
Node<T> tmp = head;
while(true){
if(tmp == null){
break;
}
System.out.println(tmp.getValue());
tmp = tmp.getNextRef();
}
}
public static void main (String args[])
{
SingleLinkList<Integer> s1 = new SingleLinkList<Integer>();
s1.add(2);
s1.add(3);
s1.add(3);
s1.traverse();
}
}
class Node<T> {
private T value;
private Node<T> nextRef;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public Node<T> getNextRef() {
return nextRef;
}
public void setNextRef(Node<T> nextRef) {
this.nextRef = nextRef;
}
public int compareTo(T arg)
{
if (arg==this.value)
{
return 0;}
else
{return 1;}
}
}
答案 0 :(得分:1)
使用适当的getter和setter将Node<T> prevRef
字段添加到列表类中,然后添加此方法:
public void linkReverse(Node<T> head) {
if (head == null) {
return;
}
head.setPrevRef(null);
if (head.getNextRef() == null) {
return;
}
Node<T> prev = head;
Node<T> curr = head.getNextRef();
while (curr != null) {
curr.setPrevRef(prev);
prev = curr;
curr = curr.getNextRef();
}
}
此方法将沿着当前单链表向下走,并将反向链接每个节点,使列表双向链接。
当然,你也需要修改其他方法,但这至少是一个很好的起点。
答案 1 :(得分:0)
只需将private Node<T> prevRef;
实例变量添加到Node
类,并在add()
方法中设置它。我建议traverse()
将收到一个布尔(或更好的,枚举)direction
参数