2011-03-26 100 views
1

如何将此双向链接列表转换为双向链接圆形列表?双向链接列表帮助

public class DoublyLinkedList { 
    private Link first; 

    private Link last; 

    public DoublyLinkedList() { 
    first = null; 
    last = null; 
    } 

    public boolean isEmpty(){ 
    return first == null; 
    } 

    public void insertFirst(long dd){ 
    Link newLink = new Link(dd); 

    if (isEmpty()) 
     last = newLink; 
    else 
     first.previous = newLink; 
    newLink.next = first; 
    first = newLink; 
    } 

    public void insertLast(long dd){ 
    Link newLink = new Link(dd); 
    if (isEmpty()) 
     first = newLink; 
    else { 
     last.next = newLink; 
     newLink.previous = last; 
    } 
    last = newLink; 
    } 

    public Link deleteFirst(){ 
    Link temp = first; 
    if (first.next == null) 
     last = null; 
    else 
     first.next.previous = null; 
    first = first.next; 
    return temp; 
    } 

    public Link deleteLast(){ 
    Link temp = last; 
    if (first.next == null) 
     first = null; 
    else 
     last.previous.next = null; 
    last = last.previous; 
    return temp; 
    } 

    public boolean insertAfter(long key, long dd) { 
    Link current = first; 
    while (current.dData != key){ 
     current = current.next; 
     if (current == null) 
     return false; // cannot find it 
    } 
    Link newLink = new Link(dd); // make new link 

    if (current == last) // if last link, 
    { 
     newLink.next = null; 
     last = newLink; 
    } else // not last link, 
    { 
     newLink.next = current.next; 

     current.next.previous = newLink; 
    } 
    newLink.previous = current; 
    current.next = newLink; 
    return true; // found it, insert 
    } 

    public Link deleteKey(long key){ 
    Link current = first; 
    while (current.dData != key) 
    { 
     current = current.next; 
     if (current == null) 
     return null; // cannot find it 
    } 
    if (current == first) // found it; first item? 
     first = current.next; 
    else 
     current.previous.next = current.next; 

    if (current == last) // last item? 
     last = current.previous; 
    else 
     // not last 
     current.next.previous = current.previous; 
    return current; // return value 
    } 

    public void displayForward() { 
    System.out.print("List (first to last): "); 
    Link current = first; // start at beginning 
    while (current != null) // until end of list, 
    { 
     current.displayLink(); 
     current = current.next; // move to next link 
    } 
    System.out.println(""); 
    } 

    public void displayBackward() { 
    System.out.print("List : "); 
    Link current = last; 
    while (current != null){ 
     current.displayLink(); 
     current = current.previous; 
    } 
    System.out.println(""); 
    } 

    public static void main(String[] args) { 
    DoublyLinkedList theList = new DoublyLinkedList(); 

    theList.insertFirst(22); 
    theList.insertFirst(44); 
    theList.insertLast(33); 
    theList.insertLast(55); 

    theList.displayForward(); 
    theList.displayBackward(); 

    theList.deleteFirst(); 
    theList.deleteLast(); 
    theList.deleteKey(11); 

    theList.displayForward(); 

    theList.insertAfter(22, 77); // insert 77 after 22 
    theList.insertAfter(33, 88); // insert 88 after 33 

    theList.displayForward(); 
    } 

} 

class Link { 
    public long dData; // data item 

    public Link next; // next link in list 

    public Link previous; // previous link in list 

    public Link(long d) 
    { 
    dData = d; 
    } 

    public void displayLink(){ 
    System.out.print(dData + " "); 
    } 

} 

感谢

+3

查看http://www.tinyurl.com/so-hints发布您到目前为止所尝试的内容。 – gideon 2011-03-26 20:19:45

+2

1)请在此处发布代码,而不是链接到现场。 2)到目前为止您尝试了什么?你究竟在哪里卡住? – MAK 2011-03-26 20:20:45

+0

圆形列表几乎相同,除了第一个和最后一个元素也链接在一起。正如其他指出,请描述你有什么问题,并显示你当前的进展。如果是家庭作业,也请求标签。 – m0s 2011-03-26 20:32:17

回答

2

清单,因为是不提供一种方法来遍历它的元素。如果是这样,你可以向列表请求一个迭代器,并从迭代器中获取列表的下一个元素,直到它到达最后一个元素。使它成为圆形将改变迭代器行为:一旦到达最后一个元素,它将返回到第一个元素。

所以,答案是要使它成为循环的,你必须改变列表的方法,以便最后一个的下一个链接是第一个链接,第一个链接是最后一个链接。但是,如果您不向列表中添加其他方法,那么这样做不会改变任何内容:一旦列表变为循环,现有方法的公共行为将保持不变。