2016-11-20 84 views
0

我已经写了一个带有添加和遍历方法的单链表的小程序。现在我想将它转换为双向链表。我知道双链表的所有概念,但在我的程序中实现它却很困难。单独转换为单向链接列表双向链接列表

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

_什么难度? – Idos

+0

如何摆放额外的食物。到一个节点...我不认为这是一个问题,你可以downvote它 – user1111880

+0

我认为@Idos试图说什么是你的具体问题是什么?你尝试过什么吗?你说得对,这不是一个坏问题,但告诉我们问题是什么。 –

回答

0

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

1

一个Node<T> prevRef字段添加到适当的getter和setter列表类,然后添加这个方法:

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(); 
    } 
} 

这个方法沿着一个当前单向链接的列表走下去,并将每个节点反向链接,使列表双向链接。

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

+0

从你的答案中得到线索,我改变了我的执行如下..但仍然是不正确的让我knw wht我失踪... class节点 {\t \t私人T值; \t私有节点 nextRef; \t私有节点 prevRef; \t公共无效加载(T元件) \t { \t \t节点 ND =新节点(); \t \tnd。的setValue(元件); \t \t \t 如果\t(头== NULL) \t \t { \t \t \t头= ND; \t \t \t nd.setNextRef(null); \t \t \t nd.setPrevRef(null); \t \t \t tail = nd; \t \t} \t \t别的 \t \t {tail.setNextRef(空); \t \t tail = nd; \t \t head.setNextRef(nd.getPrevRef()); \t \t \t tail.setPrevRef(head.getPrevRef());}} – user1111880

+0

'但仍然是不正确的,让我知道我失踪了......再一次你是模糊的。什么不行?我相信我的逻辑是正确的。 –

+0

当我使用traverse()方法时,它只是消除第一个节点,即只有2而不是其他节点数据。 – user1111880