2013-10-23 89 views
1

我有一個字符數組,我試圖將每個字符轉換爲鏈接到下一個節點的節點。問題是我一直陷入無限循環,我不知道爲什麼。這裏是我的代碼:將數組轉換爲LinkedList

String map = "ABBACBCCA"; 
char[] charArray = map.toCharArray(); 
ListNode head; 
ListNode temp; 
ListNode next; 

for (int i = 0; i < charArray.length - 1; i++) { 
    temp = new ListNode(charArray[i]); 
    next = new ListNode(charArray[i+1]); 
    temp.next = next; 

    if (i == 0) { 
      head = temp; 
    } 
} 

而且ListNode類的樣子:

class ListNode<T> { 
    public T data = null; 
    public ListNode next = null; 

    public ListNode(T data) { 
      this.data = data; 
    } 
} 

它看起來像它得到的for循環的最後一次迭代,然後被夾在一個無限循環..任何人都知道爲什麼?

+2

使用調試器。 –

+0

沒有「無限循環」的證明。唯一提供的循環(for'charArray'上的循環似乎結束了,除此之外的代碼顯然是錯誤的 – YoYo

回答

1

對於開始我想你會想:

next = new ListNode(charArray[i]); 

next = new ListNode(charArray[i+1]); 

別的東西,我注意到:

for (int i = 0; i < charArray.length - 1; i++) { 
    temp = new ListNode(charArray[i]); 
    next = new ListNode(charArray[i+1]); 
    temp.next = next; 

      if (i == 0) { 
      head = temp; 
      } 
    } 

我不認爲這會產出你想要的。它不會給你A-> B-> B-> A等,等等,它會給 - > A-> B,B-> B等等等等。不知道這是你以後的樣子。

更多了,我認爲這應該讓雅好:

​​

基本上創建和鏈接以及創建和鏈接。 (測試出來對我來說很好)傳入醜陋!

System.out.println(head.data); 
     ListNode<Character> nextptr = head.next; 
     while (true) { 

      if (nextptr.next == null) { 
       break; 
      } 
      System.out.println(nextptr.data); 
      nextptr = nextptr.next; 
     } 
+0

Ahh對不起,我錯誤地複製了代碼 –

+0

LOL我知道那種感覺!! –

+0

像Sot一樣在Eclipse中使用Debugger運行它應該可以工作 –

0

使用調試器是你最好的選擇,如果你想繼續發展自己的代碼。你應該創建一些公共方法來設置LinkList節點的下一個元素,就像我在這個例子中所做的那樣。解釋會很漫長,所以這裏是代碼。

public class Test { 

public static void main(String[] args) { 
    ListNode<Character> head = new Test().arrayToLinkList(); 

    while ((head = head.nextNode()) != null) { 
     System.out.println(head.readData()); 
    } 
} 

public ListNode<Character> arrayToLinkList() { 
    String map = "ABBACBCCA"; 
    char[] charArray = map.toCharArray(); 
    ListNode<Character> head, next; 
    head = new ListNode<Character>(charArray[0]); 
    next = head; 
    for (int i = 0; i < charArray.length - 1; i++) { 
     next = next.next(new ListNode<Character>(charArray[i + 1])); 
    } 
    return head; 
} 
} 

class ListNode<T> { 
private T data = null; 
private ListNode<T> next = null; 

public ListNode(T data) { 
    this.data = data; 
} 

public ListNode<T> next(ListNode<T> next) { 
    this.next = next; 
    return this.next; 
} 

public ListNode<T> nextNode() { 
    return this.next; 
} 

public T readData() { 
    return data; 
} 
} 
0

你的參考變量臨時&未來的每一次迭代過程中分配給新的對象和你了,履帶你的下一個指針。您可以像其他人一樣使用調試器來解決這個問題。這是一個工作示例。

public class Test { 

    public static void main(String args[]) { 
     String map = "ABBACBCCA"; 
     char[] charArray = map.toCharArray(); 
     ListNode<Character> head = null, temp = null; 
     for (int i = 0; i < charArray.length; i++) { 
      ListNode<Character> obj = new ListNode<Character>(charArray[i]); 
      if (temp != null) { 
       temp.next = obj; 
      } else { 
       head = obj; 
      } 
      temp = obj; 
     } 
     // Print the list 
     while (head != null) { 
      System.out.println(head.data); 
      head = head.next; 
     } 
    } 
} 

class ListNode<T> { 
    public T data = null; 
    public ListNode<T> next; 
    public ListNode(T data) { 
     this.data = data; 
     this.next = null; 
    } 
} 
0

這可能是更簡單的方法來建立你的鏈接列表中的一個:

String map = "ABBACBCCA"; 

ListNode<Character> head = null; 
ListNode<Character> tail = null; 

for (char c:map.toCharArray()) { 
    final ListNode<Character> node = new ListNode<>(c); 
    if (head == null) { 
    head = node; 
    } else { 
    tail.next = node; 
    } 
    tail = node; 
} 

雖然把你的類型參數的關懷無處不在

class ListNode<T> { 
    public T data = null; 
    ListNode<T> next = null; 

    public ListNode(T data) { 
    this.data = data; 
    } 
} 

更何況,你可以充分槓桿Java api's以及:

LinkedList<Character> ll = 
    "ABBACBCCA".chars() 
    .mapToObj(i->(char)i) // takes care of boxing char 
    .collect(Collectors.toCollection(LinkedList<Character>::new)); 

而且循環通過你ListNode的,你可以考慮增加:

class ListNodeIterator<T> implements Iterator<T> { 
    private ListNode<T> current; 

    public ListNodeIterator<T> ListNodeIterator(ListNode<T> node) { 
    current = node; 
    } 

    public boolean hasNext() { 
    return current.next != null; 
    } 

    public T next() { 
    current = current.next; 
    return current.data; 
    } 
} 

有了改變如下:

class ListNode<T> implements Iterable<T> { 
    public T data = null; 
    public ListNode<T> next = null; 

    public ListNode(T data) { 
    this.data = data; 
    } 

    public Iterator<T> iterator() { 
    return new ListNodeIterator<>(this); 
    } 
} 

所以你可以按如下方式使用它:

for (char c:head) { 
    System.out.println("Character: "+c); 
} 

或甚至

head.forEach(c->{System.out.println("Character: "+c);}); 

呃......那是不是通過Javaland的愉快之旅?