单独链接列表转换为双向链表

时间:2016-11-20 08:45:41

标签: java core

我已经用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;}
    }
}

2 个答案:

答案 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参数