繁体   English   中英

将下面的单链接列表转换为双链接列表

[英]convert below singly Linked list to doubly linked list

我已经编写了一个带有add和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;}
    }
}

使用适当的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();
    }
}

该方法将沿当前单链列表走,并将反向链接每个节点,从而使列表成为双链。

当然,您也需要修改其他方法,但这至少是一个很好的起点。

只需添加private Node<T> prevRef; 实例变量设置为Node类,并在add()方法期间进行设置。 我建议traverse()将收到一个布尔(甚至更好的枚举) direction参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM