2011-04-01 70 views
2

我有以下鏈接列表程序在java中工作正常,但反向鏈表功能。 我錯過了什麼?反向鏈表問題

public class LinkedList { 

private Link first; 

public LinkedList() 
{ 
    first = null; 
} 
public boolean isEmtpy() 
{ 
    return(first==null); 
} 

public void insertFirst(int id, double dd) 
{ 
    Link newLink=new Link(id,dd); 
    newLink.next=first;  //new link --> old first 
    first =newLink;   //first --> newLink 
} 
public Link deleteFirst() 
{ 
    Link temp=first; 
    first=first.next; 
    return temp; 
} 
public void displayList() 
{ 
    Link current=first; 
    System.out.println("List (first-->last)"); 
    while(current!=null) 
    { 
     current.displayLink(); 
     current=current.next; 
    }  
    System.out.println(" "); 
} 
public Link find(int key) 
{ 
    Link current=first; 

    while(current.iData!=key) 
    { 
     if(current.next==null) 
      return null; //last link 
     else 
      current=current.next; 

    } 
    return current; 
} 
public Link delete(int key) 
{ 
    Link current=first; 
    Link previous=first; 

    while (current.iData!=key) 
    { 
     if (current.next==null) 
      return null; 
     else 
     { 
      previous=current; 
      current=current.next; 
     } 
    } 
    if(current==first) 
     first=first.next; 
    else 
     previous.next=current.next; 
    return current;  
} 

public void insertAfter(int key, int id, double dd) 
{ 
    Link current=first; 
    Link previous=first; 

    Link newLink = new Link(id,dd); 
    while (current.iData!=key) 
    { 
     if (current.next==null) 
      System.out.println("At the last Node"); 
     else 
     { 
      previous=current; 
      current=current.next; 

     } 
    } 
    System.out.println("Value of previous "+ previous.iData); 
    System.out.println("Value of current after which value will be inserted is " + current.iData); 
    newLink.next=current.next; 
    current.next=newLink; 
} 

public Link reverse() 
{ 
    Link previous=null; 
    Link current=first; 
    Link forward; 

    while(current!=null) 
    { 
     forward=current.next; 
     current.next=previous; 
     previous=current; 
     current=forward; 
    } 
    return previous; 
} 
} 

回答

7

的問題是,reverse()不設置first到其新的價值,所以鏈表將被損壞(有效它將被降低到前頭元素)。

您應該添加

first = previous; 
到底

,返回之前(或代替 - 你真的需要返回新的頭節點?)。

+0

完美。謝謝,就是這樣。 – user665319 2011-04-01 07:44:51

-1

新頭返回,對嗎?我認爲頭部的下一個應該設置爲null,或者在遍歷列表時它會在最後兩個元素之間循環。

嘿,沒關係...

+0

它在遍歷期間被設置爲null。 – 2011-04-01 07:39:50

0

這是更改後的代碼。您需要將最後一個空置於null並首先重新初始化。

public Link reverse() 
{ 
    Link previous=null; 
    Link current=first; 
    Link forward; 

    while(current!=null) 
    { 
     forward=current.next; 
     current.next=previous; 
     previous=current; 
     current=forward; 
    } 
    first.next = null; 
    first = previous; 
    return previous; 
} 
}